前回は、ドライバプロセスが“ゴミ”として残らないように、起動したMicrosoft Edge WebDriverやMicrosoft Edgeを終了するためのスクリプトを先に作成した。今回は、Microsoft Edge WebDriverとMicrosoft Edgeを起動する処理をPowerShellスクリプトにまとめる。
→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。
Microsoft Edge WebDriver起動処理をスクリプト用に書き換えていく
前々回に紹介したMicrosoft Edge WebDriverの起動処理をスクリプト用に整えていく。まず、起動処理を始める前に不要なプロセスの終了処理を走らせる。
webdriver_edge_stop.ps1
PowerShellからSelenium経由でWebDriverを使うことになるので、PowerShell Seleinumモジュールが必要だ。PowerShell Seleniumモジュールがインストールされているかどうか確認し、インストールされていない場合にはインスールを行うように処理を記述する。
if (-Not (Get-InstalledModule -Name Selenium 2> $Null)) {
'Seleniumモジュールをインストールします。'
Install-Module -Name Selenium -AllowPrerelease -Force
Get-InstalledModule -Name Selenium
}
Start-SeDriverコマンドレットでMicrosoft Edge WebDriverを起動する。ここで起動してくれれば処理は完了だが、少なくとも数週間ごとには起動しなくなるので(Microsoft Edgeのバージョンが上がると、ドライバとバージョンがずれるので起動しなくなる)、起動しなかった場合の処理が重要だ。
'Microsoft Edge WebDriverを起動します。'
$Size = '1200,800'
if (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
# 起動しなかった場合の処理をここに加える
}
以降は、Microsoft Edge WebDriverが起動しなかった場合の処理だ。システムにインストールされているMicrosoft EdgeのバージョンとMicrosoft Edge WebDrvierのバージョンが不一致であることが、Microsoft Edge WebDriverが起動しない原因であると仮定し、インストールされているMicrosoft Edgeと同じバージョンのMicrosoft Edge WebDriverをダウンロードしてデプロイする処理を行う。
まず、先ほどの起動処理でゴミプロセスが残っている可能性を考慮して、終了スクリプトを実行しておく。
webdriver_edge_stop.ps1
次に、システムにインストールされているMicrosoft Edgeのバージョン番号を取得する。
$EdgeDir='C:\Program Files (x86)\Microsoft\Edge\Application\'
$EdgeVersion=( Get-ChildItem -Name $EdgeDir |
Where-Object { $_ -NotMatch "[a-zA-Z]+" }
バージョン番号を取得したら、Microsoft Edge WebDriverをダウンロードするURLと、ダウンロードしてきたファイルをデプロイするパス、デプロイするために一時的にZIPファイルを展開するディレクトリパスなどを変数に用意する。
$DriverURL="https://msedgedriver.azureedge.net/$EdgeVersion/edgedriver_win64.zip"
$SeModVer=(Get-InstalledModule -Name Selenium).Version -replace "-.+$",""
$DriverDir="$env:HOME\Documents\powershell\Modules\Selenium\$SeModVer\assemblies"
$DriverDownloadDir="$DriverDir\_download"
ダウンロードしてきたZIPファイルは一時ディレクトリで展開して処理する。次のような感じで一時ディレクトリの作成と削除を行う処理を書き、その間に展開とデプロイの処理を書けばよい。
New-Item $DriverDownloadDir -ItemType Directory -Force
# ここにドライバのダウンロードと展開の処理を書く
Remove-Item $DriverDownloadDir -Recurse -Force
Microsoft Edge WebDriver ZIPファイルのダウンロードにはcurl.exeコマンドを使う。次のように実行する。
"Microsoft Edge WebDriver version $EdgeVersion をダウンロードします。"
curl -get `
-o $DriverDownloadDir\edgedriver_win64.zip `
$DriverURL
PowerShellでは、Expand-ArchiveコマンドレットでZIPコマンドを展開することができる。次のようにダウンロードしてきたZIPファイルを展開して、Copy-ItemコマンドレットでMicrosoft Edge WebDriverの実行バイナリファイルであるmsedgedriver.exeファイルをデプロイする。
"Microsoft Edge WebDriver version $EdgeVersion をインストールします。"
Expand-Archive -Path $DriverDownloadDir\edgedriver_win64.zip `
-Destination $DriverDownloadDir `
-Force
Copy-Item -Path $DriverDownloadDir\msedgedriver.exe `
-Destination $DriverDir\msedgedriver.exe `
-Force
これでMicrosoft EdgeとMicrosoft Edge WebDriverのバージョンが一致したはずなので、再度Microsoft Edge WebDriverの起動処理を行う。
if (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
# ここでさらに起動しない場合には原因が不明なので、ドライバを終了して
# スクリプトも終了する
webdriver_edge_stop.ps1
Exit
}
通常であれば、ここでMicrosoft Edge WebDriverとMicrosoft Edgeが起動する。もし起動してこないなら、もうどうにもならないのでそのまま処理を終了する。
スクリプトにまとめる
上記処理をPowerShellスクリプトにまとめる。まとめた「webdriver_edge_start.ps1」は次のようになる。
#!/usr/bin/env pwsh
#========================================================================
# Microsoft Edge WebDriverを起動する
#========================================================================
#========================================================================
# 動作しているMicrosoft Edge WebDriverをすべて終了
#========================================================================
webdriver_edge_stop.ps1
#========================================================================
# Seleniumモジュールがない場合にはインストール
#========================================================================
if (-Not (Get-InstalledModule -Name Selenium 2> $Null)) {
'Seleniumモジュールをインストールします。'
Install-Module -Name Selenium -AllowPrerelease -Force
Get-InstalledModule -Name Selenium
}
#========================================================================
# Microsoft Edge WebDriverを起動
#========================================================================
'Microsoft Edge WebDriverを起動します。'
$Size = '1200,800'
if (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
#================================================================
# Microsoft EdgeとMicrosoft Edge WebDriverのバージョンが一致して
# いないためにドライバが動作しなかった可能性がある。
#================================================================
#================================================================
# 不要なドライバプロセスを終了
#================================================================
webdriver_edge_stop.ps1
#================================================================
# Microsoft Edgeのバージョン番号
#================================================================
$EdgeDir='C:\Program Files (x86)\Microsoft\Edge\Application\'
$EdgeVersion=( Get-ChildItem -Name $EdgeDir |
Where-Object { $_ -NotMatch "[a-zA-Z]+" } )
#================================================================
# Microsoft Edge WebDriverダウンロードURLとデプロイ先パス
#================================================================
$DriverURL="https://msedgedriver.azureedge.net/$EdgeVersion/edgedriver_win64.zip"
$SeModVer=(Get-InstalledModule -Name Selenium).Version -replace "-.+$",""
$DriverDir="$env:HOME\Documents\powershell\Modules\Selenium\$SeModVer\assemblies"
$DriverDownloadDir="$DriverDir\_download"
#================================================================
# WebDriverダウンロード用の一時ディレクトリを作成
#================================================================
New-Item $DriverDownloadDir -ItemType Directory -Force
#================================================================
# Microsoft Edgeと同じバージョンのMicrosoft Edge WebDriverを
# ダウンロード
#================================================================
"Microsoft Edge WebDriver version $EdgeVersion をダウンロードします。"
curl -get `
-o $DriverDownloadDir\edgedriver_win64.zip `
$DriverURL
#================================================================
# Microsoft Edge WebDriverをデプロイ
#================================================================
"Microsoft Edge WebDriver version $EdgeVersion をインストールします。"
Expand-Archive -Path $DriverDownloadDir\edgedriver_win64.zip `
-Destination $DriverDownloadDir `
-Force
Copy-Item -Path $DriverDownloadDir\msedgedriver.exe `
-Destination $DriverDir\msedgedriver.exe `
-Force
#================================================================
# WebDriverダウンロード用の一時ディレクトリを削除
#================================================================
Remove-Item $DriverDownloadDir -Recurse -Force
#================================================================
# Microsoft Edge WebDriverを起動する
#================================================================
if (-Not (Start-SeDriver -Browser Edge -Size $Size 2> $Null 3> $Null))
{
#========================================================
# 原因不明の起動不能
#========================================================
#========================================================
# 不要なドライバプロセスを終了
#========================================================
webdriver_edge_stop.ps1
Exit
}
}
'Microsoft Edge WebDriverの起動処理完了。'
これでPowerShellからMicrosoft Edgeを操作する場合には「webdriver_edge_start.ps1」と「webdriver_edge_stop.ps1」の2つのスクリプトで開始と終了を行えばよいことになる。ここまでまとめておけば、最低限、実用に足るはずだ。
作成したスクリプトを実行して動作を確認する
作成したスクリプトを実行して動作を確認する。まず、次のように作成した「webdriver_edge_start.ps1」スクリプトを実行する。
PS C:\Users\daichi> webdriver_edge_start.ps1
Microsoft Edge WebDriverを起動します。
Microsoft Edge WebDriverの起動処理完了。
PS C:\Users\daichi>
すると、次のようにWebDriver経由で操作できるMicrosoft Edgeが起動する。
この状態でPowerShellからPowerShell Seleniumモジュールのコマンドレットを実行すれば、Microsoft Edgeをいろいろと操作することができる。ここまで準備ができれば、後は用途に応じてMicrosoft Edgeを操作していくだけである。いろんな操作が可能なので、自動化による時短を楽しめるはずだ。
なお、ここで「webdriver_edge_stop.ps1」を実行すればスッキリと関連プロセスを全部終了させることができる。これで、お膳立てとしては十分な状態が整った。