Hi,
the selenium module from the powershell gallery outdated is outdated.
Here is my method to use the latest selenium nuget version for a script with Chrome.
First load requiered assemblies
1 | PS D:\> [System.Reflection.Assembly] ::LoadWithPartialName( "System.IO.Compression.FileSystem" ) |
Create a project directory
1 2 3 | PS D:\> mkdir D:\MyProject PS D:\> cd D:\MyProject PS D:\> $PWD = "D:\MyProject" |
Define URLs for Selenium.WebDriver, Newtonsoft.Json,Chromedriver, Edgedriver and Firefox. URLs are the link to nuget packages which are zip conpressed files.
1 2 3 4 5 6 7 8 9 10 | PS D:\MyProject> $sChromWebdriverURL = 'https://www.nuget.org/api/v2/package/Selenium.WebDriver.ChromeDriver' PS D:\MyProject> $sEdgeWebdriverURL = 'https://www.nuget.org/api/v2/package/Selenium.WebDriver.MSEdgeDriver' PS D:\MyProject> $sFireFoxWebdriverURL = 'https://www.nuget.org/api/v2/package/Selenium.WebDriver.GeckoDriver' PS D:\MyProject> $sNewtonSoftDLL = [System.IO.Path] ::Combine( $PWD , "Newtonsoft.Json.dll" ) PS D:\MyProject> $sSeleniumWebdriverDLL = [System.IO.Path] ::Combine( $PWD , "WebDriver.dll" ) PS D:\MyProject> $sChromeWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "chromedriver.exe" ) PS D:\MyProject> $sEdgeWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "msedgedriver.exe" ) PS D:\MyProject> $sFirefoxWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "geckodriver.exe" ) |
Download the files
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | PS D:\MyProject> $sTempNewtonSoftNUGETPackage = [System.IO.Path] ::GetTempFileName() PS D:\MyProject> Invoke-WebRequest -Uri $sNewtonSoftURL -OutFile $sTempNewtonSoftNUGETPackage PS D:\MyProject> $sNewtonSoftNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempNewtonSoftNUGETPackage ) PS D:\MyProject> $sNewtonSoftNUGETPackage .Entries | ?{ $_ .FullName -eq "lib/net45/Newtonsoft.Json.dll" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sNewtonSoftDLL ) } PS D:\MyProject> $sTempSeleniumWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() PS D:\MyProject> Invoke-WebRequest -Uri $sSeleniumWebdriverURL -OutFile $sTempSeleniumWebdriverNUGETPackage PS D:\MyProject> $sSeleniumWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempSeleniumWebdriverNUGETPackage ) PS D:\MyProject> $sSeleniumWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "lib/netstandard2.0/WebDriver.dll" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sSeleniumWebdriverDLL ) } PS D:\MyProject> $sTempChromeWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() PS D:\MyProject> Invoke-WebRequest -Uri $sChromWebdriverURL -OutFile $sTempChromeWebdriverNUGETPackage PS D:\MyProject> $sChromeWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempChromeWebdriverNUGETPackage ) PS D:\MyProject> $sChromeWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "driver/win32/chromedriver.exe" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sChromeWebdriverEXE ) } |
Download and load assembly and start the browser with 2 functions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | function Load-Selenium { <# .SYNOPSIS Loads the selenium libraries for a specific browser .DESCRIPTION Loads the selenium libraries for a specific browser. If the libraries not exists the function loads the latest version. .PARAMETER Download Force download of the latest version before loading #> param ( [ Parameter ( mandatory = $false )][ ValidateSet ( 'Chrome' , 'Edge' , 'Firefox' )] [string] $ForBrowser , [ Parameter ( mandatory = $false )] [switch] $Download = $false ) [System.Reflection.Assembly] ::LoadWithPartialName( "System.IO.Compression.FileSystem" ) | out-null $sNewtonSoftDLL = [System.IO.Path] ::Combine( $PWD , "Newtonsoft.Json.dll" ) $sSeleniumWebdriverDLL = [System.IO.Path] ::Combine( $PWD , "WebDriver.dll" ) $sChromeWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "chromedriver.exe" ) $sEdgeWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "msedgedriver.exe" ) $sFirefoxWebdriverEXE = [System.IO.Path] ::Combine( $PWD , "geckodriver.exe" ) if (!( Test-Path $sNewtonSoftDLL ) -or $Download ) { if ( [appdomain] ::currentdomain.GetAssemblies() | ?{ $_ .Location -eq $sNewtonSoftDLL }) { write-host ( "{0} is loaded and cannot be updated. Please close powershell window(s)" -f $sNewtonSoftDLL ) return } $sTempNewtonSoftNUGETPackage = [System.IO.Path] ::GetTempFileName() Invoke-WebRequest -Uri $sNewtonSoftURL -OutFile $sTempNewtonSoftNUGETPackage $sNewtonSoftNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempNewtonSoftNUGETPackage ) $sNewtonSoftNUGETPackage .Entries | ?{ $_ .FullName -eq "lib/net45/Newtonsoft.Json.dll" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sNewtonSoftDLL , $true ) } $sNewtonSoftNUGETPackage .Dispose() Remove-item $sTempNewtonSoftNUGETPackage } Add-Type -Path $sNewtonSoftDLL -ErrorAction Stop if (!( Test-Path $sSeleniumWebdriverDLL ) -or $Download ) { if ( [appdomain] ::currentdomain.GetAssemblies() | ?{ $_ .Location -eq $sSeleniumWebdriverDLL }) { write-host ( "{0} is loaded and cannot be updated. Please close powershell window(s)" -f $sSeleniumWebdriverDLL ) return } $sTempSeleniumWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() Invoke-WebRequest -Uri $sSeleniumWebdriverURL -OutFile $sTempSeleniumWebdriverNUGETPackage $sSeleniumWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempSeleniumWebdriverNUGETPackage ) $sSeleniumWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "lib/netstandard2.0/WebDriver.dll" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sSeleniumWebdriverDLL , $true ) } $sSeleniumWebdriverNUGETPackage .Dispose() Remove-item $sTempSeleniumWebdriverNUGETPackage } Add-Type -Path $sSeleniumWebdriverDLL -ErrorAction Stop if ( $ForBrowser -eq "Chrome" ) { if (!( Test-Path $sChromeWebdriverEXE ) -or $Download ) { $sTempChromeWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() Invoke-WebRequest -Uri $sChromWebdriverURL -OutFile $sTempChromeWebdriverNUGETPackage $sChromeWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempChromeWebdriverNUGETPackage ) $sChromeWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "driver/win32/chromedriver.exe" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sChromeWebdriverEXE , $true ) } $sChromeWebdriverNUGETPackage .Dispose() Remove-item $sTempChromeWebdriverNUGETPackage } } if ( $ForBrowser -eq "Edge" ) { if (!( Test-Path $sEdgeWebdriverEXE ) -or $Download ) { $sTempEdgeWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() Invoke-WebRequest -Uri $sEdgeWebdriverURL -OutFile $sTempEdgeWebdriverNUGETPackage $sEdgeWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempEdgeWebdriverNUGETPackage ) $sEdgeWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "driver/win32/msedgedriver.exe" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sEdgeWebdriverEXE , $true ) } $sEdgeWebdriverNUGETPackage .Dispose() Remove-item $sTempEdgeWebdriverNUGETPackage } } if ( $ForBrowser -eq "Firefox" ) { if (!( Test-Path $sFirefoxWebdriverEXE ) -or $Download ) { $sTempFirefoxWebdriverNUGETPackage = [System.IO.Path] ::GetTempFileName() Invoke-WebRequest -Uri $sFirefoxWebdriverURL -OutFile $sTempFirefoxWebdriverNUGETPackage $sFirefoxWebdriverNUGETPackage = [System.IO.Compression.ZipFile] ::OpenRead( $sTempFirefoxWebdriverNUGETPackage ) $sFirefoxWebdriverNUGETPackage .Entries | ?{ $_ .FullName -eq "driver/win32/Firefoxdriver.exe" } | %{ [System.IO.Compression.ZipFileExtensions] ::ExtractToFile( $_ , $sFirefoxWebdriverEXE , $true ) } $sFirefoxWebdriverNUGETPackage .Dispose() Remove-item $sTempFirefoxWebdriverNUGETPackage } } } function Start-Browser { param ( [ Parameter ( mandatory = $true )][ ValidateSet ( 'Chrome' , 'Edge' , 'Firefox' )] [string] $browser ) Load-Selenium -ForBrowser $browser switch ( $browser ){ 'Chrome' { $chrome = Get-Package -ErrorAction SilentlyContinue | ?{ $_ .Name -like "Google Chrome*" } | select -First 1 if (! $chrome ){ throw "Google Chrome Browser not installed." return } # create driver service $oDriverService = [OpenQA.Selenium.Chrome.ChromeDriverService] ::CreateDefaultService( $PWD ) # hide command prompt window $oDriverService .HideCommandPromptWindow = $true # create driver object $driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver $oDriverService } 'Edge' { $edge = Get-Package -Name 'Microsoft Edge*' -ErrorAction SilentlyContinue | select -First 1 if (! $edge ){ throw "Microsoft Edge Browser not installed." return } # create driver service $oDriverService = [OpenQA.Selenium.Edge.EdgeDriverService] ::CreateDefaultService( $PWD ) # hide command prompt window $oDriverService .HideCommandPromptWindow = $true $driver = New-Object OpenQA.Selenium.Edge.EdgeDriver $oDriverService } 'Firefox' { $ff = Get-Package -Name "Mozilla Firefox*" -ErrorAction SilentlyContinue | select -First 1 if (! $ff ){ throw "Mozilla Firefox Browser not installed." return } # create driver service $oDriverService = [OpenQA.Selenium.Firefox.FirefoxDriverService] ::CreateDefaultService( $PWD ) # hide command prompt window $oDriverService .HideCommandPromptWindow = $true # create driver object $driver = New-Object OpenQA.Selenium.Firefox.FirefoxDriver $oDriverService } } return $driver } |
Some examples. Load the functions (i.e. copy & paste to the powershell window) then
1 2 3 4 | PS D:\> mkdir MySeleniumProject PS D:\> cd D:\MySeleniumProject PS D:\MySeleniumProject> $WebDriver = Start-Browser Chrome |
Page reload
1 | $WebDriver .navigate().refresh() |
Get EBay price
1 | $WebDriver .FindElements( [OpenQA.Selenium.By] ::ClassName( "x-price-primary" )).FindElements( [OpenQA.Selenium.By] ::TagName( "span" )).Text |
Bit button
1 2 | $WebDriver .FindElements( [OpenQA.Selenium.By] ::XPath( "//button[@data-elementid='MaxBidId']" )) $WebDriver .FindElements( [OpenQA.Selenium.By] ::XPath( "//button[@data-elementid='MaxBidId']" )).Click() |
Get price input span element
1 | $WebDriver .FindElements( [OpenQA.Selenium.By] ::XPath( "//span[contains(@class,'textbox app-input-price__input textbox__empty')]" )) |
Get the input tag (child of span)
1 | $InputTag =( $WebDriver .FindElements( [OpenQA.Selenium.By] ::XPath( "//span[contains(@class,'textbox app-input-price__input textbox__empty')]" ))).findelements( [OpenQA.Selenium.By] ::TagName( "input" )) |
Send backspaces to delete input
1 2 3 4 | for ( $i =12; $i -ge 0; $i --) { $InputTag .SendKeys( [OpenQA.Selenium.Keys] ::Backspace) } |
Send price
1 | $InputTag .SendKeys( "10,00" ) |