Skip to content

Instantly share code, notes, and snippets.

@sba923
Last active February 7, 2024 08:18
Show Gist options
  • Save sba923/d5406e7fded598b9c1131ddf9f099564 to your computer and use it in GitHub Desktop.
Save sba923/d5406e7fded598b9c1131ddf9f099564 to your computer and use it in GitHub Desktop.
Update Selenium drivers found on the PATH
# 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)
}
}
@sba923
Copy link
Author

sba923 commented Mar 17, 2023

  • Added support for -Verbose
  • remove MicrosoftWebDriver.exe if present alongside msedgedriver.exe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment