Private/ReelGoodSeleniumLoginCheck.ps1

function ReelGoodSeleniumLoginCheck {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$false)]
        [ValidatePattern('[0-9]')]
        [int]$ChromeProfileNumber = '0',

        [parameter(Mandatory=$true)]
        [ValidateSet("UserNamePwd","Google","Facebook")]
        [string]$LoginType
    )

    $ServiceName = 'ReelGood'
    $SiteUrl = "https://reelgood.com"

    $ChromeUserData = "$HOME\AppData\Local\Google\Chrome\User Data"
    $AvailableProfiles = $(Get-ChildItem -Path $ChromeUserData -Directory -Filter "Profile *").Name
    $ProfileDirName = 'Profile ' + $ChromeProfileNumber
    $ChromeProfile = @($AvailableProfiles) -match $ProfileDirName
    if (!$ChromeProfile) {
        Write-Error "Unable to find Chrome Profile '$ProfileDirName'. Halting!"
        return
    }

    switch ($LoginType) {
        'UserNamePwd'   {$Message = "Login to $ServiceName using your $ServiceName account UserName and Password"}
        'Google'        {$Message = "Login to $ServiceName using your $LoginType account UserName and Password"}
        'Facebook'      {$Message = "Login to $ServiceName using your $LoginType account UserName and Password"}
    }

    # Make sure we can connect to the Url
    try {
        $null = CheckUrlStatus -SiteUrl $SiteUrl -ErrorAction Stop
    } catch {
        Write-Error $_
        return
    }

    try {
        $null = ChromeDriverAndEventGhostCheck -ErrorAction Stop
    } catch {
        Write-Error $_
        return
    }

    try {
        #$Driver = Start-SeFirefox
        #$ChromeOptions = [OpenQA.Selenium.Chrome.ChromeOptions]::new()
        #$ChromeOptions.AddArguments("headless")
        #$ChromeOptions.AddArguments("window-size=1200x600")
        #$ChromeOptions.AddArguments("user-data-dir=$ChromeUserData")
        #$ChromeOptions.AddArguments("profile-directory=$LindaChromeProfile")
        #$Driver = [OpenQA.Selenium.Chrome.ChromeDriver]::new($ChromeOptions)
        $Driver = Start-SeChrome -Arguments @("window-size=1200x600", "user-data-dir=$ChromeUserData", "profile-directory=$ChromeProfile")
        # The below Tab + Enter will clear either the "Chrome was not shutdown properly" message or the "Chrome is being controlled by automated software" message
        #[OpenQA.Selenium.Interactions.Actions]::new($Driver).SendKeys([OpenQA.Selenium.Keys]::Tab).Perform()
        #[OpenQA.Selenium.Interactions.Actions]::new($Driver).SendKeys([OpenQA.Selenium.Keys]::Enter).Perform()
        #& "C:\Program Files (x86)\EventGhost\EventGhost.exe" -event ClearChromeRestoreMsg
        $EventGhostProcess = Get-Process eventghost -ErrorAction SilentlyContinue
        if ($EventGhostProcess) {$null = $EventGhostProcess | Stop-Process -ErrorAction SilentlyContinue}
        $EventGhostConfigFilePath = $(Get-Module AutoWebCreds).ModuleBase + '\' + 'EventGhost' + '\' + 'ConfigurationFiles' + '\' + 'eventghosttreett.xml'
        $null = Start-Process -FilePath "C:\Program Files (x86)\EventGhost\EventGhost.exe" -ArgumentList "-file `"$EventGhostConfigFilePath`""
        Start-Sleep -Seconds 1
        $null = Start-Process -FilePath "C:\Program Files (x86)\EventGhost\EventGhost.exe" -ArgumentList "-event `"MinimizeEventGhost`""
        Start-Sleep -Seconds 1
        $null = Start-Process -FilePath "C:\Program Files (x86)\EventGhost\EventGhost.exe" -ArgumentList "-event `"ClearChromeRestoreMsg`""
        Enter-SeUrl $SiteUrl -Driver $Driver

        # Determine if we see a "Login" button. If we do, then we need to login
        $LoginButton = Get-SeElement -By LinkText -Selection 'Login' -Target $Driver
        if (!$LoginButton) {
            throw "Unable to find the Login button! Halting!"
        }
    } catch {
        Write-Error $_
        return
    }

    if ($LoginButton) {
        if ([System.Environment]::OSVersion.Version.Build -lt 10240) {
            try {
                # Have the user provide Credentials
                [pscredential]$PSCreds = GetAnyBoxPSCreds -ServiceName $ServiceName -ErrorAction Stop
            } catch {
                Write-Error $_
                return
            }
        } else {
            try {
                [pscredential]$PSCreds = UWPCredPrompt -ServiceName $ServiceName -SiteUrl $SiteUrl -Message $Message -ErrorAction Stop
            } catch {
                Write-Error $_
                return
            }
        }

        try {
            # We need to actually Login
            Send-SeClick -Element $LoginButton -Driver $Driver -ErrorAction Stop
        } catch {
            Write-Error $_
            return
        }

        ### Basic UserName and Password Login ####
        if ($LoginType -eq "UserNamePwd") {
            try {
                $null = ReelGoodUserNamePwdLogin -SeleniumDriver $Driver -PSCreds $PSCreds -ErrorAction Stop
            } catch {
                Write-Warning $_.Exception.Message
            }
        }

        ### Login With Google ###
        if ($LoginType -eq "Google") {
            try {
                # Next click, the "Login with Google" button
                $LoginWithGoogleButton = Get-SeElement -By XPath -Selection '//*[@id="modal_mountpoint"]/div/div/div[2]/div[1]/a[2]/button' -Target $Driver
                if (!$LoginWithGoogleButton) {
                    throw "Cannot find 'Login With Google' button! Halting!"
                }
                Send-SeClick -Element $LoginWithGoogleButton -Driver $Driver -ErrorAction Stop
            } catch {
                Write-Error $_
                return
            }

            # Even if the below fails, we might be okay if the Chrome Browser is already signed into a Google Account
            try {
                $GoogleLoginResult = GoogleAccountLogin -SeleniumDriver $Driver -PSCreds $PSCreds -ErrorAction Stop
                if ($GoogleLoginResult.GetType().FullName -eq 'OpenQA.Selenium.Chrome.ChromeDriver') {
                    $Driver = $GoogleLoginResult
                }
            } catch {
                Write-Warning $_.Exception.Message
            }
        }

        ### Login With Facebook ###
        if ($LoginType -eq "Facebook") {
            try {
                # Get "Continue With Facebook" Link
                $ContinueWithFacebookLink = Get-SeElement -By XPath -Selection '//*[@id="modal_mountpoint"]/div/div/div[2]/div[1]/a[1]' -Target $SeleniumDriver
                if (!$ContinueWithFacebookLink) {
                    throw "Cannot find 'Continue With Facebook' link! Halting!"
                    return
                }
                Send-SeClick -Element $ContinueWithFacebookLink -Driver $SeleniumDriver -ErrorAction Stop
            } catch {
                Write-Error $_
                return
            }

            try {
                $FacebookLoginResult = FacebookAccountLogin -SeleniumDriver $Driver -PSCreds $PSCreds -ErrorAction Stop
                if ($FacebookLoginResult.GetType().FullName -eq 'OpenQA.Selenium.Chrome.ChromeDriver') {
                    $Driver = $FacebookLoginResult
                }
            } catch {
                Write-Warning $_.Exception.Message
            }
        }
        

        # So we need to check the webpage for an indication that we are actually logged in now
        try {
            $SuccessfulLoginIndicator = Get-SeElement -By XPath -Selection '//*[@href="/userlist/tracking"]' -Target $Driver
            if (!$SuccessfulLoginIndicator) {
                throw 'Unable to determine login was successful!'
            } else {
                $global:SuccessfulLogin = $True
                Write-Host "Successfully signed in!" -ForegroundColor Green
            }
        } catch {
            Write-Warning $_.Exception.Message
        }
    }

    $Driver

    <#
    $Driver.Close()
    $Driver.Dispose()
    #>

}