Public/Url.ps1

function Set-MonocleUrl
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Url,

        [switch]
        $Force
    )

    # Test the URL first, ensure it exists
    $code = 0
    if (!$Force) {
        $code = Test-MonocleUrl -Url $Url
    }

    # Browse to the URL and wait till it loads
    $count = 1
    $timeout = Get-MonocleTimeout

    while ($count -le $timeout) {
        try {
            Write-MonocleHost -Message "Navigating to: $url (Status: $code) [attempt: $($count)]"
            $Browser.Navigate().GoToUrl($Url) | Out-Null
            Start-MonocleSleepWhileBusy

            break
        }
        catch {
            $count++
            if ($count -gt $timeout) {
                throw $_.Exception
            }

            Start-Sleep -Seconds 1
        }
    }
}

function Get-MonocleUrl
{
    [CmdletBinding()]
    [OutputType([string])]
    param()

    return $Browser.Url
}

function Get-MonocleTimeout
{
    [CmdletBinding()]
    [OutputType([int])]
    param()

    $timeout = [int]$Browser.Manage().Timeouts().PageLoad.TotalSeconds
    if ($timeout -le 0) {
        $timeout = 30
    }

    return $timeout
}

function Set-MonocleTimeout
{
    [CmdletBinding()]
    param(
        [Parameter()]
        [int]
        $Timeout = 30
    )

    if ($Timeout -le 0) {
        $Timeout = 30
    }

    $Browser.Manage().Timeouts().PageLoad = [timespan]::FromSeconds($Timeout)
}

function Edit-MonocleUrl
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $Pattern,

        [Parameter(Mandatory=$true)]
        [string]
        $Value,

        [switch]
        $Force
    )

    $Url = ((Get-MonocleUrl) -ireplace $Pattern, $Value)
    Set-MonocleUrl -Url $Url -Force:$Force
    Start-MonocleSleepWhileBusy
}

function Wait-MonocleUrl
{
    [CmdletBinding(DefaultParameterSetName='Url')]
    param (
        [Parameter(Mandatory=$true, ParameterSetName='Url')]
        [string]
        $Url,

        [Parameter(Mandatory=$true, ParameterSetName='Pattern')]
        [string]
        $Pattern,

        [Parameter(ParameterSetName='Url')]
        [switch]
        $StartsWith
    )

    # generic values
    $timeout = Get-MonocleTimeout
    $seconds = 0

    switch ($PSCmdlet.ParameterSetName.ToLowerInvariant())
    {
        'pattern' {
            Write-MonocleHost -Message "Waiting for URL to match pattern: $($Pattern)]"

            while ((Get-MonocleUrl) -inotmatch $Pattern) {
                if ($seconds -ge $timeout) {
                    throw "Expected URL to match pattern: $($Pattern)`nBut got: $(Get-MonocleUrl)"
                }

                $seconds++
                Start-Sleep -Seconds 1
            }
        }

        'url' {
            Write-MonocleHost -Message "Waiting for URL: $($Url)]"

            while ((!$StartsWith -and ((Get-MonocleUrl) -ine $Url)) -or ($StartsWith -and !((Get-MonocleUrl).StartsWith($Url, [StringComparison]::InvariantCultureIgnoreCase)))) {
                if ($seconds -ge $timeout) {
                    throw "Expected URL: $($Url)`nBut got: $(Get-MonocleUrl)"
                }

                $seconds++
                Start-Sleep -Seconds 1
            }
        }
    }

    Write-MonocleHost -Message "Expected URL loaded after $($seconds) seconds(s)"
    Start-MonocleSleepWhileBusy
}

function Wait-MonocleUrlDifferent
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]
        $FromUrl
    )

    # generic values
    $timeout = Get-MonocleTimeout
    $seconds = 0

    Write-MonocleHost -Message "Waiting for URL to change from: $($FromUrl)"

    while (($newUrl = Get-MonocleUrl) -ieq $FromUrl) {
        if ($seconds -ge $timeout) {
            throw "Expected URL to change: From $($FromUrl)`nBut got: $($newUrl)"
        }

        $seconds++
        Start-Sleep -Seconds 1
    }

    Write-MonocleHost -Message "URL changed after $($seconds) seconds(s)"
    Start-MonocleSleepWhileBusy
}