Powershell: Use latest selenium version

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")

Leave a Reply