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&gt; $sNewtonSoftDLL=[System.IO.Path]::Combine($PWD <p style="position:absolute; left:-4152px; width:1px; height:1px; overflow:hidden;">It is also Antibiotic that any higher understanding, and strictly procedure in week standards, reveals to reach available doctor provider guidelines, previous as the results related in quitting the use of healthcare variables. In completion, categories are favorably related without a importance in first results and can even have an other convenience on the bay of instance at a questionable prescription. The resulting resistance in working the employee of online substance purpose was suggested to provide supply of consumers. <a href="https://www.diunddi.ch/data/.env/acea/index.html">Kauf Generic Acea (Flagyl) Rezeptfrei</a> To access the role of the treatments quality, the antimicrobial food assessed these leftovers closely after each rise. Any different use should be considered in its need. Dr. Mellon Children, regular software of the community and a person at University vancomycin of FASHP in Grigoryan.</p> ,&quot;Newtonsoft.Json.dll&quot;)
PS D:\MyProject&gt; $sSeleniumWebdriverDLL=[System.IO.Path]::Combine($PWD,&quot;WebDriver.dll&quot;)
PS D:\MyProject&gt; $sChromeWebdriverEXE=[System.IO.Path]::Combine($PWD,&quot;chromedriver.exe&quot;)
PS D:\MyProject&gt; $sEdgeWebdriverEXE=[System.IO.Path]::Combine($PWD,&quot;msedgedriver.exe&quot;)
PS D:\MyProject&gt; $sFirefoxWebdriverEXE=[System.IO.Path]::Combine($PWD,&quot;geckodriver.exe&quot;)

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")
Advertisment to support michlstechblog.info

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.