前回は、PowerShellからMicrosoft Edgeで表示したWebページの入力フィールドに文字列を入力するサンプルを取り上げた。比較的わかりやすいサンプルだったと思う。今回は、PowerShellからチェックボックスをクリックする方法を紹介しよう。

→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。

チェックボックスやラジオボックスをPowerShellからクリックする

今回はサンプルページとして「Checkout example · Bootstrap v5.0」を使用する。

  • Checkout example · Bootstrap v5.0

    Checkout example · Bootstrap v5.0

このサンプルページは、下の方に次のようなチェックボックスとラジオボックスがある。

  • Checkout example · Bootstrap v5.0の下の方にあるチェックボックスとラジオボックス

    Checkout example · Bootstrap v5.0の下の方にあるチェックボックスとラジオボックス

このチェックボックスやラジオボックスをPowerShellからクリックしてみよう。

XPathを調べる

前回説明したように、操作を行うには対象となる要素を取得する必要がある。そしてそれにはXPathを使う方法が汎用的だ。Microsoft Edgeの開発者モード(メニュー:「その他のツール」→「開発者ツール」または「Ctrl」+「Shift」+「I」)を開いて、チェックボックスおよびラジオボックスの要素(input)のXPathを調べておく。

  • 操作するチェックボックスおよびラジオボックスのXPathを調べる

    操作するチェックボックスおよびラジオボックスのXPathを調べる

それぞれのXPathは次のようになっている。

要素 XPath
Shipping address is the same as my billing address //∗[@id="same-address"]
Save this information for next time //∗[@id="save-info"]
Credit card //∗[@id="credit"]
Debit card //∗[@id="debit"]
PayPal //∗[@id="paypal"]

ではPowerShellから操作していこう。

PowerShellからクリックを行う

まず、PowerShell経由でMicrosoft Edgeを操作するためのMicrosoft Edge WebDriverを起動する(このスクリプトは付録として本稿の末尾に掲載している)。

PS C:\Users\daichi> webdriver_edge_start.ps1
Microsoft Edge WebDriverを起動します。
Microsoft Edge WebDriverの起動処理完了。
PS C:\Users\daichi> 

Set-SeUrlコマンドレットでサンプルページ「Checkout example · Bootstrap v5.0」を開く。

PS C:\Users\daichi> Set-SeUrl -Url https://getbootstrap.jp/docs/5.0/examples/checkout/
PS C:\Users\daichi>

すると、次のような感じで指定されたWebページが表示される。

  • Checkout example · Bootstrap v5.0

    Checkout example · Bootstrap v5.0

次にGet-SeElementコマンドレットで対象となるチェックボックス(input要素)を取得して、クリックを行う。クリックは「Invoke-SeClick -Element $Element -Action Click」のようにInvoke-SeClickコマンドレットで実行する。

PS C:\Users\daichi> $Element = Get-SeElement -By XPath -Value '//*[@id="same-address"]'
PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>

次のようにチェックボックスが選択された状態になる。

  • チェックボックスが選択された状態になる

    チェックボックスが選択された状態になる

ここでもう一度Invoke-SeClickコマンドレットを実行すると、チェックボックスの選択が解除された状態になる。

PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>
  • チェックボックスが解除された状態になる

    チェックボックスが解除された状態になる

ユーザーがマウスを使ってチェックボックスをクリックするのと同じ操作が、PowerShell経由で実行できていることがお分かりいただけただろう。

とりあえずさらにもう1回実行して、チェックボックスを選択した状態にしておく。

PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>

もう一つのチェックボックスを取得して、同じようにクリックを行う。

PS C:\Users\daichi> $Element = Get-SeElement -By XPath -Value '//*[@id="save-info"]'
PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>

次のようにこちらのチェックボックスもクリックされた状態になる。

  • チェックボックスが選択された状態になる

    チェックボックスが選択された状態になる

今度はラジオボックスをクリックしてみよう。このサンプルではラジオボックスの1つ目は最初から選択されているので、2つ目のラジオボックスを取得してクリックしてみる。

PS C:\Users\daichi> $Element = Get-SeElement -By XPath -Value '//*[@id="debit"]'
PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>

次のように、選択されたラジオボックスが1つ目から2つ目に移動することがわかる。

  • 2つ目のラジオボックスが選択された状態になる

    2つ目のラジオボックスが選択された状態になる

同じように今度は3つ目のラジオボックスを取得してクリックする。

PS C:\Users\daichi> $Element = Get-SeElement -By XPath -Value '//*[@id="paypal"]'
PS C:\Users\daichi> Invoke-SeClick -Element $Element -Action Click
PS C:\Users\daichi>

次のように3つ目のラジオボックスが選択された状態になる。

  • 3つ目のラジオボックスが選択された状態になる

    3つ目のラジオボックスが選択された状態になる

操作が終わったら終了用のスクリプトを呼び出して、Microsoft EdgeとWebDriverを終了する。

PS C:\Users\daichi> webdriver_edge_stop.ps1
動作しているMicrosoft Edge WebDriverを終了します。

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     23     8.29      23.89       0.03   20512   5 msedgedriver
動作しているMicrosoft Edge WebDriverの終了処理完了。

PS C:\Users\daichi>

終了用のスクリプトも付録として末尾に掲載しておくので、参考にしてもらえればと思う。

PowershellスクリプトでMicrosoft Edgeの操作を自動化する

これで、チェックボックスやラジオボックスの選択を行うことができるようになった。前回紹介した、入力フィールドに文字列を入力する方法と合わせ、これら2つの方法を知っているだけでも、Webページ経由の操作をかなり自動化できるようになる。

最近、ネットワークに接続するタイプのデバイスはHTTPサーバを搭載しているものが多く、Webブラウザ経由で情報を取得したり、設定を変更したりできる仕組みになっているものが多い。これはつまり、ログを見たり、設定を変更したりするのにWebブラウザを操作する必要があるということだ。この操作を自動化してなるべく楽をしたい。できれば、Webブラウザを使った操作すら自動化したい。そこでPowerShell Seleniumというわけだ。

PowerShell Seleniumを使うと、Webブラウザの操作を自動化して、例えばデバイスのログ情報を自動的に取得するとか、Webインタフェースを経由してデバイスの設定を変更する、再起動を行うといった操作を自動化できる。タスクマネージャに登録すれば起動すらも自動化できる。一度やるとやみつきになる便利さだ。本連載では、もう少し基本的な操作方法を説明したら、そういった実際の応用事例についても紹介していく。

付録

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の起動処理完了。'

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の終了処理完了。'
}