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
PS D:\> [System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
Create a project directory
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.
PS D:\MyProject> $sNewtonSoftURL='https://www.nuget.org/api/v2/package/Newtonsoft.Json' PS D:\MyProject> $sSeleniumWebdriverURL='https://www.nuget.org/api/v2/package/Selenium.WebDriver' 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
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
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
$sNewtonSoftURL='https://www.nuget.org/api/v2/package/Newtonsoft.Json'
$sSeleniumWebdriverURL='https://www.nuget.org/api/v2/package/Selenium.WebDriver'
$sChromWebdriverURL='https://www.nuget.org/api/v2/package/Selenium.WebDriver.ChromeDriver'
$sEdgeWebdriverURL='https://www.nuget.org/api/v2/package/Selenium.WebDriver.MSEdgeDriver'
$sFireFoxWebdriverURL='https://www.nuget.org/api/v2/package/Selenium.WebDriver.GeckoDriver'
$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
PS D:\> mkdir MySeleniumProject PS D:\> cd D:\MySeleniumProject PS D:\MySeleniumProject> $WebDriver = Start-Browser Chrome PS D:\MySeleniumProject> $WebDriver.Url = "https://www.ebay.de"
Page reload
$WebDriver.navigate().refresh()
Get EBay price
$WebDriver.FindElements([OpenQA.Selenium.By]::ClassName("x-price-primary")).FindElements([OpenQA.Selenium.By]::TagName("span")).Text
Bit button
$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
$WebDriver.FindElements([OpenQA.Selenium.By]::XPath("//span[contains(@class,'textbox app-input-price__input textbox__empty')]"))
Get the input tag (child of span)
$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
for($i=12;$i -ge 0;$i--)
{
$InputTag.SendKeys([OpenQA.Selenium.Keys]::Backspace)
}
Send price
$InputTag.SendKeys("10,00")