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() #> } |