これまでに、PowerShellからMicrosoft Edgeを操作する基本的な方法を一通り説明した。今回は、それらを総括しておきたい。現状、日本語でPowerShell Selenium 4に関するまとまった説明はあまりないので、資料として参考にしてもらえればと思う。
→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。
事前準備: PowerShell Seleniumモジュールのインストール
PowerShell Selenium 4 (PowerShell Selenium 4.0.0-preview3)を使うためにモジュールをインストールする。インストールは次のコマンドレットを実行する。
Install-Module -Name Selenium -AllowPrerelease -Force
PowerShell Selenium 4 (PowerShell Selenium 4.0.0-preview3)がインストールされているかどうかはGet-InstalledModuleコマンドレットで確認する。
PS C:\Users\daichi> Get-InstalledModule -Name Selenium
Version Name Repository Description
------- ---- ---------- -----------
4.0.0-preview3 Selenium PSGallery Web automation using the Selenium Web Driver
PS C:\Users\daichi>
モジュールのインストールも含めて自動的に準備するスクリプト(webdriver_edge_start.ps1)は付録として稿末に記したので、参考にしてもらえればと思う。
事前準備: Microsoft Edge WebDriverバイナリのインストール
PowerShell SeleniumからMicrosoft Edgeを操作するために、WindowsにインストールされているMicrosoft Edgeのバージョンに対応したMicrosoft Edge WebDriverバイナリを所定の場所(~\Documents\powershell\Modules\Selenium\4.0.0\assemblies\msedgedriver.exe)にインストールする。
ドライバは次のURLから調べて該当するURLからダウンロードする。
Microsoft Edge WebDriverバイナリは、Microsoft Edgeのバージョンが上がるごとに、Microsoft Edge WebDriverバイナリも対応するバージョンに変更する必要がある。毎回これを手動で準備するのは面倒なので、この処理も自動的に行うようにするスクリプト(webdriver_edge_start.ps1)を用意した。こちらも稿末の付録に入れておいたので、参考にしていただきたい。
事前準備: Microsoft Edge WebDriverを起動
PowerShell Seleniumコマンドレットを実行する前に、Microsoft Edge WebDriverを起動するためのコマンドレットを実行し、操作対象となるMicrosoft Edgeを起動する。上記2つの事前準備ができた状態で、次のコマンドレットを実行する。
Start-SeDriver -Browser Edge -Size '1200,800'
なお、全ての操作が終了したら次のコマンドレットでMicrosoft EdgeとMicrosoft Edge WebDriverを終了する。
Stop-SeDriver
これらの事前準備を自動的に行うようにしたPowerShellスクリプトが、付録にした「webdriver_edge_start.ps1」と「webdriver_edge_stop.ps1」だ。基本的にこの2つのスクリプトを処理の開始と終了に実行すればすべてが整う仕組みになっている。
操作可能なMicrosoft Edgeが起動している状況で、以降のPowerShell Seleniumコマンドレットを使ってMicrosoft Edgeを動作することができる。
PowerShell Seleniumコマンドレット: Webページを開く
操作したいWebページを開く。
Set-SeUrl -Url URL
ベーシック認証が必要なWebページの場合、次のようにコマンドレットを実行する。
Set-SeUrl -Url https://ユーザ名:パスワード@ドメイン名/パス
PowerShell Seleniumコマンドレット: 要素取得
操作対象となる要素を取得する。
◆要素を取得: XPathを使う方法
$Element = Get-SeElement -By XPath -Value xpath
◆要素を取得: IDを使う方法
$Element = Get-SeElement -By Id -Value id
◆要素を取得: Nameを使う方法
$Element = Get-SeElement -By Name -Value name
XPathを使う方法が汎用的だろう。
PowerShell Seleniumコマンドレット: 操作系
Webページ内操作は基本的に次のコマンドレットで行う。
◆クリックする
Invoke-SeClick -Element $Element -Action Click
◆文字列を入力する
Invoke-SeKeys -Element $Element -Keys 文字列
◆select要素で対象を選択する
Set-SeSelectValue -Element $Element -Value 値
◆ダイアログでOKを押す
SeShouldHave -Alert -PassThru | Clear-SeAlert -Action Accept
PowerShell Seleniumコマンドレット: 待機
要素がクリックできるようになるまでは、次のようにして待機する。
Wait-SeElement -By XPath -Value xpath -Condition ElementToBeClickable -Timeout 秒
PowerShell Seleniumコマンドレット:JavaScriptコードの実行
JavaScriptは次のコマンドレットで実行する。最終的にはこの方法で対象となるWebページをほぼ自在に操作できる。
Invoke-SeJavascript -Script 'JavaScriptコード'
Microsoft Edgeのさまざまな操作が可能
今回まとめて紹介した方法で、PowerShellからMicrosoft Edgeに表示したWebページに関するさまざまな操作を行うことができる。従来、人が手動で行っていたような操作が、PowerShellスクリプトで自動的に処理できるようになるわけだ。これはとても強力な機能だと言えるだろう。
Microsoft Edgeを使ったWebページ操作の自動化がもたらす効果は大きい。特にそのルーティーンが規則性のあるもので、プログラムによる自動化が可能なのであれば、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]+" } |
Select-Object -First 1 )
# ↑ 【Select-Object -First 1の理由】
# 更新前のバージョンと更新後のバージョンが同時に
# 存在するタイミングがあるので、更新後のバージョン
# のみを取得するためにSelect-Objectを実行している。
#================================================================
# 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の起動処理完了。'
webdriver_edge_stop.ps1
#!/usr/bin/env pwsh
#========================================================================
# Microsoft Edge WebDriverを終了する
#========================================================================
#========================================================================
# WebDriverプロセスを終了
#========================================================================
if (Get-Process -Name msedgedriver 2> $Null)
{
'動作しているMicrosoft Edge WebDriverを終了します。'
Get-Process -Name msedgedriver 2> $Null
# Microsoft Edge WebDriverを終了
Stop-SeDriver 2> $Null
# まだ動作しているほかのMicrosoft Edge WebDriverを終了
if (Get-Process -Name msedgedriver 2> $Null)
{
Get-Process -Name msedgedriver 2> $Null | Stop-Process
}
'動作しているMicrosoft Edge WebDriverの終了処理完了。'
}