自分は 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 できた.
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
# 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 の更新に失敗しました") | |
} |