2022年5月4日水曜日

Selenium Chrome / Edge driver 更新を自動化する

 自分は Selenium + PowerShell でいろいろ Web 操作を自動化しているが,Chrome / Edge の自動 Update に合わせて Chrome / Edge Driver も更新しないと,スクリプト実行時にエラーで停止してしまう.
(Edge はよく知らないけど) Chrome は結構頻繁に更新されてしまうので,Driver も自動更新させてみた.

Chrome / Edge / Edge Driver のバージョンは exe のリソースに埋め込まれているので,

(get-item ("ファイル")).VersionInfo.FileVersion
で取得できる.Chrome driver は exe リソースにバージョン番号が記録されてないので,適当なテキストファイルに Driver バージョンを記録して,次回はそれを参照することにする.

あとは,Chrome / Edge と Driver のメジャーバージョン番号が異なっていれば,Invoke-WebRequest で Driver をダウンロードして zip 展開すれば良い.

というわけで,以下コード.これを Selenim を使用する PowerShell スクリプトの先頭で

. "selenium.ps1" # インクルード
UpdateDriver('chrome') # または 'edge'
とすることで Driver を自動で Update できた.

# selenium Driver ロード
$SeleniumRoot = ($MyInvocation.MyCommand.Source -replace '\\[^\\]*$', '') + '\selenium'
Add-Type -Path "$SeleniumRoot\selenium-dotnet-3.14.0\Selenium.WebDriver.3.14.0\lib\net45\WebDriver.dll";
Add-Type -Path "$SeleniumRoot\selenium-dotnet-3.14.0\Selenium.Support.3.14.0\lib\net45\WebDriver.Support.dll"
Add-Type -Path "$SeleniumRoot\selenium-dotnet-3.14.0\Selenium.WebDriverBackedSelenium.3.14.0\lib\net45\Selenium.WebDriverBackedSelenium.dll"
function MessageBox($Msg){
try{
Add-Type -Assembly System.Windows.Forms
}catch{}
[System.Windows.Forms.MessageBox]::Show($Msg)
}
function GetFileVersion($Path){
if(Test-Path $Path){
return (get-item ($Path)).VersionInfo.FileVersion -replace '\..*', ''
}
}
function UpdateDriver($Browser){
$ProgressPreference = 'SilentlyContinue'
if($Browser -eq 'chrome'){
# Chrome version 取得
$ver = GetFileVersion("c:\Program Files\Google\Chrome\Application\chrome.exe")
if($ver -eq ''){$ver = GetFileVersion("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")}
if(Test-Path "$SeleniumRoot\chromedriver.version"){$drv_ver = (Get-Content "$SeleniumRoot\chromedriver.version")}
# chromedriver version と比較
if($drv_ver -and $ver -and ($drv_ver -ge $ver)){return}
Write-Output "Updating chromedriver v.$ver"
try{
# chromedriver ダウンロード
if((Invoke-WebRequest -UseBasicParsing 'https://chromedriver.chromium.org/downloads').Content -match "If you are using Chrome version $ver, please download ChromeDriver ([\d\.]+)"){
$url = "https://chromedriver.storage.googleapis.com/" + $Matches[1] + "/chromedriver_win32.zip"
Write-Host "Get $url"
Invoke-WebRequest -UseBasicParsing $url -OutFile "${env:TEMP}\chromedriver.zip"
# 解凍
Expand-Archive -Path "${env:TEMP}\chromedriver.zip" -DestinationPath $SeleniumRoot -Force
}
# chromedriver version 出力
Write-Output $ver | Out-File -Encoding utf8 "$SeleniumRoot\chromedriver.version"
return
}catch{}
}
elseif($Browser -eq 'edge'){
# Edge version 取得
$ver = GetFileVersion("C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")
$drv_ver = GetFileVersion($SeleniumRoot + "\msedgedriver.exe")
# edgedriver version と比較
if($drv_ver -and $ver -and ($drv_ver -ge $ver)){return}
Write-Output "Updating edgedriver v.$ver"
try{
# edgedriver ダウンロード
if((Invoke-WebRequest -UseBasicParsing 'https://developer.microsoft.com/ja-jp/microsoft-edge/tools/webdriver/').Content -match "バージョン: ($ver\.[\d\.]+)"){
$url = "https://msedgedriver.azureedge.net/" + $Matches[1] + "/edgedriver_win64.zip"
Write-Host "Get $url"
Invoke-WebRequest -UseBasicParsing $url -OutFile "${env:TEMP}\edgedriver.zip"
# 解凍
Expand-Archive -Path "${env:TEMP}\edgedriver.zip" -DestinationPath $SeleniumRoot -Force
return
}
}catch{}
}
MessageBox("driver の更新に失敗しました")
}
view raw selenium.ps1 hosted with ❤ by GitHub