Last active
February 7, 2024 08:18
-
-
Save sba923/d5406e7fded598b9c1131ddf9f099564 to your computer and use it in GitHub Desktop.
Update Selenium drivers found on the PATH
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# this is one of Stéphane BARIZIEN's public domain scripts | |
# the most recent version can be found at: | |
# https://gist.github.com/sba923/d5406e7fded598b9c1131ddf9f099564#file-update-seleniumdriver-ps1 | |
[CmdletBinding()] | |
param( | |
[Parameter(ParameterSetName = 'InstallIfMissing', Mandatory = $true)][switch] $InstallIfMissing, | |
[Parameter(ParameterSetName = 'InstallIfMissing', Mandatory = $true)][string] $Destination, | |
[Parameter(ParameterSetName = 'NoParameters')] [switch] $_NeverUseThisParameter | |
) | |
# requires the scripts in https://gist.github.com/sba923/d0d5ad16f2b12d7785adf830b0395dc2 | |
$seleniummanager = whence -q selenium-manager | |
if ($null -eq $seleniummanager) | |
{ | |
throw ("'selenium-manager' not found on PATH") | |
} | |
# make sure selenium-manager is the latest version | |
$tmpfile = Join-Path -Path $env:TEMP -ChildPath 'selenium-manager.exe' | |
# determine URL for latest production-ready, released selenium-manager.exe | |
# (see https://github.com/SeleniumHQ/selenium/issues/11694#issuecomment-1927884476) | |
$url = @(((Invoke-WebRequest -Uri 'https://github.com/SeleniumHQ/selenium/blob/selenium-4.17.0/common/selenium_manager.bzl').Content -split "`n") -match '\.exe' -replace '.*(https://[^"]+selenium-manager-windows\.exe).*','$1')[0] | |
Invoke-WebRequest -Uri $url -OutFile $tmpfile | |
if (!(Test-Path -LiteralPath $tmpfile)) | |
{ | |
throw ("Cannot retrieve latest 'selenium-manager.exe' from '{0}'" -f $url) | |
} | |
if ((Get-FileHash -Path $tmpfile).Hash -ne ((Get-FileHash -Path $seleniummanager).Hash)) | |
{ | |
Write-Verbose ("Updating '{0}'..." -f $seleniummanager) | |
Copy-Item -Destination $seleniummanager -Path $tmpfile | |
} | |
Remove-Item -Path $tmpfile | |
Write-Verbose ("Using {0}" -f (selenium-manager --version)) | |
$drivers = @{ | |
'edge' = 'msedgedriver.exe' | |
'chrome' = 'chromedriver.exe' | |
'firefox' = 'geckodriver.exe' | |
} | |
foreach ($browser in $drivers.Keys) | |
{ | |
Write-Verbose ("Updating Selenium driver '{0}' for browser '{1}'" -f $drivers[$browser], $browser) | |
$sm = selenium-manager --browser $browser --output JSON | ConvertFrom-JSON | |
# need to join all lines from selenium-manager's output to account for possible multiple-line output with e.g. WARN | |
$olddriveronpath = $null | |
if ($sm.result.code -eq 0) | |
{ | |
$warningitems = @($sm.logs | Where-Object { $_.level -eq 'WARN' }) | |
if ($warningitems.Count -gt 0) | |
{ | |
$warnings = $warningitems.message -join "`n" | |
} | |
else { | |
$warnings = '' | |
} | |
if ($warnings -match 'it is advised to delete the driver in PATH and retry') | |
{ | |
Write-Verbose ("selenium-manager has emitted the 'it is advised to delete the driver in PATH and retry' warning, deleting '{0}' and retrying" -f $sm.result.driver_path) | |
$olddriveronpath = whence -q $drivers[$browser] | |
if ($null -eq $olddriveronpath) | |
{ | |
Write-Host -ForegroundColor Magenta ("selenium-manager warning was unexpected: no {0} on PATH" -f $drivers[$browser]) | |
} | |
else | |
{ | |
Remove-Item -LiteralPath $olddriveronpath -Force -ErrorAction Stop -Verbose:($PSBoundParameters.ContainsKey('Verbose')) | |
$sm = selenium-manager --browser $browser --output JSON | ConvertFrom-JSON | |
if ($sm.result.code -ne 0) | |
{ | |
throw ("selenium-manager failed: {0}" -f ($sm.logs -join "`n")) | |
} | |
} | |
} | |
$smdriver = $sm.result.driver_path | |
Write-Verbose ("Selenium Manager has retrieved '{0}'" -f $smdriver) | |
$sdriver = whence -q $drivers[$browser] | |
if ($null -ne $sdriver) | |
{ | |
$smdriver_i = Get-Item -LiteralPath $smdriver | |
$sdriver_i = Get-Item -LiteralPath $sdriver | |
if (($null -eq $smdriver_i.VersionInfo.FileVersion) -or ($null -eq $sdriver_i.VersionInfo.FileVersion)) | |
{ | |
if ((Get-FileHash $sdriver_i.FullName).Hash -ne (Get-FileHash $smdriver_i.FullName).Hash) | |
{ | |
Write-Host -ForegroundColor Yellow ("Updating '{0}' from {1} to {2}" -f $drivers[$browser], $sdriver_i.FullName, $smdriver_i.FullName) | |
Copy-Item -Verbose -LiteralPath $smdriver -Destination $sdriver | |
} | |
else | |
{ | |
Write-Verbose ("'{0}' is already up to date" -f $sdriver) | |
} | |
} | |
else | |
{ | |
if ($smdriver_i.VersionInfo.FileVersion -gt $sdriver_i.VersionInfo.FileVersion) | |
{ | |
Write-Host -ForegroundColor Yellow ("Updating '{0}' from {1} to {2}" -f $drivers[$browser], $sdriver_i.VersionInfo.FileVersion, $smdriver_i.VersionInfo.FileVersion) | |
Copy-Item -Verbose -LiteralPath $smdriver -Destination $sdriver | |
} | |
else | |
{ | |
Write-Verbose ("'{0}' is already up to date: version {1}" -f $sdriver, $sdriver_i.VersionInfo.FileVersion) | |
} | |
} | |
if ($browser -eq 'edge') | |
{ | |
$mswebdriver = Join-Path -Path $sdriver_i.Directory -ChildPath 'MicrosoftWebDriver.exe' | |
if (Test-Path -LiteralPath $mswebdriver) | |
{ | |
if (Get-Process -Name MicrosoftWebDriver -ErrorAction SilentlyContinue) | |
{ | |
Stop-Process -name MicrosoftWebDriver -ErrorAction SilentlyContinue | |
} | |
} | |
Copy-Item -Verbose -Destination $mswebdriver -LiteralPath $sdriver | |
} | |
} | |
else | |
{ | |
if ($InstallIfMissing -or ($null -ne $olddriveronpath)) | |
{ | |
if ($null -eq $olddriveronpath) | |
{ | |
$sdriver = Join-Path -Path $Destination -ChildPath $drivers[$browser] | |
} | |
else | |
{ | |
$sdriver = $olddriveronpath | |
$Destination = Split-Path -Path $olddriveronpath -Parent | |
} | |
Write-Host -ForegroundColor Yellow ("Installing '{0}' as '{1}'" -f $drivers[$browser], $sdriver) | |
Copy-Item -Verbose -LiteralPath $smdriver -Destination $sdriver | |
if ($browser -eq 'edge') | |
{ | |
$mswebdriver = Join-Path -Path $Destination -ChildPath 'MicrosoftWebDriver.exe' | |
if (Test-Path -LiteralPath $mswebdriver) | |
{ | |
if (Get-Process -Name MicrosoftWebDriver -ErrorAction SilentlyContinue) | |
{ | |
Stop-Process -name MicrosoftWebDriver -ErrorAction SilentlyContinue | |
} | |
} | |
Copy-Item -Verbose -Destination $mswebdriver -LiteralPath $sdriver | |
} | |
} | |
else | |
{ | |
Write-Error ("'{0}' not on PATH" -f $drivers[$browser]) | |
} | |
} | |
} | |
else | |
{ | |
Write-Error ("Failed to retrieve Selenium driver for '{0}': selenium-manager returned '{1}'" -f $browser, $sm) | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-Verbose
MicrosoftWebDriver.exe
if present alongsidemsedgedriver.exe