Examples/Combined.tests.ps1

. "$(Join-Path -Path $PSScriptRoot -ChildPath '_TestDependencies.ps1' )"
      
$Global:TestCaseSettings = Get-TestCasesSettings 
$Global:BrowserOptHash = $Global:TestCaseSettings."$Global:DefaultBrowser".DefaultOptions
$Env:BrowserOptText = Build-StringFromHash $Global:BrowserOptHash
$Env:BrowserID = "$Global:DefaultBrowser on $([System.Environment]::OSVersion.Platform)"
Describe "Testing the tailspin toys demo site at $env:SITE_URL" {
    BeforeAll {
        . "$(Join-Path -Path $PSScriptRoot -ChildPath '_TestDependencies.ps1' )"
      
        $Global:TestCaseSettings = Get-TestCasesSettings 
        $Global:BrowserOptHash = $Global:TestCaseSettings."$Global:DefaultBrowser".DefaultOptions
        $Env:BrowserOptText = Build-StringFromHash $Global:BrowserOptHash
        #Relying on environment variable to pick the browser. Capture ID for use in logs by requesting verbose and redirecting it.
        try { Start-SeDriver -Browser $Global:DefaultBrowser -StartURL $env:SITE_URL  @Global:BrowserOptHash -Verbose  4>&1  -ErrorAction Stop } catch { throw $_ }
        $Env:BrowserID = "$Global:DefaultBrowser on $([System.Environment]::OSVersion.Platform)"
   
    }
    Context "in $($Env:BrowserID) with settings ($Env:BrowserOptText)" {
        It "produced the right modal dialog for the <name>" -TestCases (Get-ModalTestCases) {
            Param ($linkXPath, $modalXPath)
            SeShouldHave   $modalXPath -With displayed eq $false -Timeout 10
            SeElement      $linkXPath | Invoke-SeClick  -Action Click_JS -Sleep 1
            SeElement   $modalXPath   | SeElement -By ClassName 'close' | Invoke-SeClick -Action Click_JS -Sleep 1
            SeShouldHave  'body'       -By   TagName
            SeShouldHave   $modalXPath -With displayed eq $false
        }
    }
    # Additional tests would be here
    AfterAll { Stop-SeDriver }
}
#endregion

#URLs we will visit in the remaining tests

#


#As before rely on environment variable to pick browser. Capture ID by requesting & redirecting verbose
Describe "PsGallery Test" {
    BeforeAll {
        . "$(Join-Path -Path $PSScriptRoot -ChildPath '_TestDependencies.ps1' )"
        $PSGalleryPage = 'https://www.powershellgallery.com/'
        $Global:TestCaseSettings = Get-TestCasesSettings 
        $Global:BrowserOptHash = $Global:TestCaseSettings[$Global:DefaultBrowser].DefaultOptions
        $Env:BrowserOptText = Build-StringFromHash $Global:BrowserOptHash
        try { Start-SeDriver -Browser $Global:DefaultBrowser -StartURL $PSGalleryPage @Global:BrowserOptHash -Verbose  4>&1  -ErrorAction Stop }catch {}
        $Env:BrowserID = "$Global:DefaultBrowser on $([System.Environment]::OSVersion.Platform)"
    }
    Context "in $Env:BrowserID with settings ($Env:BrowserOptText)" {
        It 'opened the browser, saving the webdriver in a global variable ' {
            Get-SeDriver -Current                                          | Should -Not -BeNullOrEmpty
            Get-SeDriver -Current                                          | Should -BeOfType [OpenQA.Selenium.Remote.RemoteWebDriver]
        }
        
        It 'reached the right starting page ' {
            #Should have can check alerts, page title, URL or an element on the page
            SeShouldHave -URL eq $PSGalleryPage
        }
        It 'found the "Sign in" link on the home page by partial text ' {
            SeShouldHave -By PartialLinkText 'Sign in' -With href match logon
        }
        It 'found the search box on the home page by ID ' {
            SeShouldHave -By Id search
        }
        It 'found the search box on the home page by Name ' {
            SeShouldHave -By Name 'q'
        }
        It 'found the search box on the home page by css selector ' {
            #can write -By <<mechanism>> [-selection] <<selection text>>
            # or [-selection] <<selection text>> -By <<mechanism>>
            SeShouldHave 'input[name=q]' -By CssSelector
        }
        It 'found the search box on the home page by class name ' {
            SeShouldHave -By ClassName "search-box"
        }
        It 'found the search box on the home page by Tagname and typed in it ' {
            #get element, pipe as input element for Typing, pass the element through
            #so pester catches 'null or empty' if it was not found
            Get-SeElement -By TagName -Value 'input' |
                Invoke-SeKeys -ClearFirst -Keys "selenium{{Enter}}" -PassThru -Sleep 2    | Should -Not -BeNullorEmpty
        }
        It 'searched successfully ' {
            $linkpath = '//*[@id="skippedToContent"]/section/div[1]/div[2]/div[2]/section[1]/div/table/tbody/tr/td[1]/div/div[2]/header/div[1]/h1/a'
            SeShouldHave -URL                 match 'packages\?q=selenium' -Timeout 15
            #Two tests on the same element, second passes it through to click
            SeShouldHave $linkpath -With href match selenium
            SeShouldHave $linkpath -With Text like *selenium* -PassThru | Invoke-SeClick -Action Click_JS -Sleep 5
        }
        It 'opened the search result page and found the expected content ' {
            #Just to show we can test for the presence of multiple links. Each one is re-tested ...
            SeShouldHave '//*[@id="version-history"]/table/tbody[1]/tr[1]/ td[1]/a/b' ,
            '//*[@id="skippedToContent"]/section/div/aside/ul[2]/li[1]/a' -Timeout 15

            SeShouldHave '//*[@id="version-history"]/table/tbody[1]/tr[1]/ td[1]/a/b' -With text match "current"

            #Can test with "Get-SeElement | where-object <<complex test>>" rather than "with <<feild>> <<operator>> <<value>>"
            SeElement    '//*[@id="skippedToContent"]/section/div/aside/ul[2]/li[1]/a'  |
                Where-Object { ($_.text -like "*Project Site*") -and ($_.GetAttribute('href') -match "selenium") } |
                    Invoke-SeClick -PassThru  | Should -Not -Benullorempty
        }
        It 'went to Github from the project link on the search result ' {
            SeShouldHave -URL  match 'github' -Timeout 30
        }
        It 'navigated back to the start page and closed the browser ' {
            Set-SeUrl -Back
            Set-SeUrl -Back
            Set-SeUrl -Back
            SeShouldHave -URL eq $PSGalleryPage -Timeout 30
            Stop-SeDriver
            Get-SeDriver -Current                                              | Should      -BeNullOrEmpty
        }
    }
    AfterAll { Stop-SeDriver }
}


Describe "Alerts and Selection boxes tests" {
    BeforeAll {
        . "$(Join-Path -Path $PSScriptRoot -ChildPath '_TestDependencies.ps1' )"
        $AlertTestPage = 'https://www.w3schools.com/js/tryit.asp?filename=tryjs_alert'
        $SelectTestPage = 'https://www.w3schools.com/html/tryit.asp?filename=tryhtml_elem_select'
        $Global:TestCaseSettings = Get-TestCasesSettings 
        $Global:BrowserOptHash = $Global:TestCaseSettings[$Global:DefaultBrowser].PrivateOptions
        $Env:BrowserOptText = Build-StringFromHash $Global:BrowserOptHash

        if ($Env:BrowserOptText) {
            $Global:NoLabel = [string]::IsNullOrEmpty($Global:TestCaseSettings[$Global:DefaultBrowser].InPrivateLabel)
            $wv = $null
            try { Start-SeDriver -Browser $Global:DefaultBrowser -StartURL $alertTestPage  @BrowserOptHash -WarningVariable wv  -ErrorAction Stop }catch {}
            if ($wv) { Write-Output "##vso[task.logissue type=warning]$wv" }
        }
        else {
            $Global:NoLabel = $true
            try { Start-SeDriver -Browser $Global:DefaultBrowser -StartURL $alertTestPage    -ErrorAction Stop } catch {}

        }
        $Env:BrowserID = "$Global:DefaultBrowser on $([System.Environment]::OSVersion.Platform)"
    }
    Context "in $Env:BrowserID with settings ($Env:BrowserOptText)" {
        # It 're-opended the browser and validated "InPrivate" mode by window title ' {
        # $DriverProcess = Get-Process *driver | Where-Object { $_.Parent.id -eq $pid }
        # $BrowserProcess = Get-Process | Where-Object { $_.Parent.id -eq $DriverProcess.id -and $_.Name -ne "conhost" }
        # $BrowserProcess.MainWindowTitle | Should match $Global:TestCaseSettings[$Global:DefaultBrowser].InPrivateLabel
        # } -Skip:$Global:NoLabel
        It 'opened the right page ' {
            SeShouldHave -URL -eq $alertTestPage
        }
        It 'Navigated to the child iframe' { #'triggered and dismissed an alert'
            SeShouldHave -Selection "iframe" -By TagName -with id eq iframeResult
            Switch-SeFrame  'iframeResult'
            Get-SeElement "/html/body/button"   | Should -Not -BeNullOrEmpty  #Removed | Invoke-SeClick -PassThru
            #Checking the text of the alert is optional. Dissmiss can pass the alert result through
            #{ Wait-SeDriver -Condition AlertState -Value $false -Timeout 15 -ErrorAction Stop } | Should -Not -throw
            #Clear-SeAlert -Alert $Alert -Action Dismiss -PassThru | Should -Not -BeNullOrEmpty
        }
        It 'reselected the parent frame ' {
            Switch-SeFrame -Parent
            SeShouldHave -Selection "iframe" -By TagName -with id eq iframeResult
        }
        It 'navigated to a new page, and found the "cars" selection box in frame 1 ' {
            Set-SeUrl  $SelectTestPage
            SeShouldHave -Selection "iframe" -By TagName -with id eq iframeResult
            Switch-SeFrame 'iframeResult'
            $e = SeElement -by Name "cars"
            $e | Should -Not -BeNullOrEmpty
            (Get-SeSelectValue -Element $e -All).Items.Text | Should -Contain 'volvo'
        }
        It 'made selections from the "cars" selection box ' {
            $e = SeElement -by Name "cars"
            #Values are lower case Text has inital caps comparisons are case sensitve. Index is 0-based
            { $e | Set-SeSelectValue -By Value -value  "Audi" }                                 | Should      -Throw
            { $e | Set-SeSelectValue -By Value -value "audi" }                                  | Should -not -throw
            $e | Set-SeSelectValue -By Index -value "2"; (Get-SeSelectValue -Element $e).Text   | Should      -Be 'Fiat'
            $e | Set-SeSelectValue -By Text  -value "Sa*"
        }
        It 'submitted the form and got the expected response ' {
            Get-SeElement '/html/body/form/input' | Invoke-SeClick -Sleep 5
            Switch-SeFrame -Parent
            Switch-SeFrame 'iframeResult'
            SeShouldHave "/html/body/div[1]" -with text match "cars=saab"
        }
        It 'closed the in-private browser instance ' {
            Stop-SeDriver
            if ($DriverProcess.Id) {
                (Get-Process -id $DriverProcess.id ).HasExited             | Should      -Be $true
            }
            if ($BrowserProcess.Id) {
                (Get-Process -id $BrowserProcess.id).HasExited             | Should      -Be $true
            }
        }
    }
    AfterAll { Stop-SeDriver }
}

  
$Global:BrowserOptHash = $Global:TestCaseSettings[$Global:DefaultBrowser].HeadlessOptions
$Env:BrowserOptText = Build-StringFromHash  $Global:BrowserOptHash
$Global:SkipTests = [String]::IsNullOrEmpty($Env:BrowserOptText)

Describe "'Headless' mode browser test" {
    BeforeAll {
        . "$(Join-Path -Path $PSScriptRoot -ChildPath '_TestDependencies.ps1' )"
        $Global:TestCaseSettings = Get-TestCasesSettings 

        $Global:BrowserOptHash = $Global:TestCaseSettings[$Global:DefaultBrowser].HeadlessOptions
        $Env:BrowserOptText = Build-StringFromHash  $Global:BrowserOptHash
        $Global:SkipTests = $true
        if (![String]::IsNullOrEmpty($Env:BrowserOptText)) {
            $Global:SkipTests = $false
            try { $Env:BrowserID = Start-SeDriver -Browser $Global:DefaultBrowser -StartURL $env:SITE_URL  @BrowserOptHash  -ErrorAction Stop }catch {}
        } 
        $Env:BrowserID = "$Global:DefaultBrowser on $([System.Environment]::OSVersion.Platform)"
    }
    Context "in $Env:BrowserID with settings ($Env:BrowserOptText)" {
        It 're-opened the Browser in "Headless" mode' {
            if ($PSVersionTable.PSVersion.Major -eq 5) {
                $Processes = Get-CimInstance -Class Win32_Process
                $DriverProcess = $Processes | Where { $_.Name -like '*driver.exe' -and $_.ParentProcessId -eq $Pid }
                $BrowserProcess = $Processes | Where-Object { $_.ParentProcessId -eq $DriverProcess.ProcessId -and $_.Name -ne 'conhost.exe' }
                if ($BrowserProcess -ne $null) {
                    (Get-process -Id $BrowserProcess.ProcessId).MainWindowHandle   | Should      -be 0
                }
            }
            else {
                $DriverProcess = Get-Process *driver | Where-Object { $_.Parent.id -eq $pid }
                $BrowserProcess = Get-Process         | Where-Object { $_.Parent.id -eq $DriverProcess.id -and $_.Name -ne 'conhost' }
                $BrowserProcess.MainWindowHandle  | Select-Object -First 1     | Should      -be 0
            }
        }
        it 'did a google Search ' {
            Set-SeUrl 'https://www.google.com/ncr'
            SeShouldHave -by Name q
            SeShouldHave -by ClassName 'gLFyf'
            SeShouldHave -By Name q -PassThru | Where Displayed -eq $true | 
                Select-Object -First 1 | Invoke-SeKeys -Keys 'Powershell-Selenium{{Enter}}' -PassThru  | 
                    should -Not -BeNullOrEmpty

            SeShouldHave '//*[@id="tsf"]/div[2]/div[1]/div[1]/a' -PassThru |
                Invoke-SeClick -PassThru                 | should -Not -BeNullOrEmpty
        }
        It 'closed the browser a third time ' {
            Stop-SeDriver
            Get-SeDriver -Current                                          | Should      -BeNullOrEmpty
            if ($DriverProcess.Id) {
                (Get-Process -id $DriverProcess.id ).HasExited             | Should      -Be $true
            }
            if ($BrowserProcess.Id) {
                (Get-Process -id $BrowserProcess.id).HasExited             | Should      -Be $true
            }
        }
    } -Skip:$Global:SkipTests
    AfterAll { Stop-SeDriver }
}