今回からは数回にわたり、PowerShellからMicrosoft Edgeを操作する方法を取り上げていく。作業効率を劇的に引き上げてくれる可能性の高い機能なので、じっくり取り組んで使い方をマスターしてしまおう。

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

Microsoftプロダクトを操作するPowerShell

Microsoftは、PowerShellをWindowsやMicrosoftプロダクト/サービスを連携させたり、操作・管理したりするためのシェルに位置付けている。こうしたケースでPowerShellを使わない場合、ユーザーは多くの作業をGUI経由で行うことになる。これは手間もかかるし、ヒューマンエラーも発生しやすい。したがって、PowerShellで業務をシンプルにしていくことが、業務の効率化につながるというわけだ。

Webブラウザで仕事ができるようになっている

最近は多くの作業がWebインタフェースに統合される動きを見せている。もちろんその進度は、業務や業界によって大きな開きがある。すでにほとんどの作業がWebインタフェースで行われている企業もあれば、全くそうでない企業もあるだろう。

とは言え、今後、産業界全体としてWeb技術の活用は広まっていくと考えられる。

そうなると問題なのは、PowerShellはWebブラウザを制御することができないという点だ。PowerShellはMicrosoft独自の技術である。現在、そのコア実装はオープンソースソフトウエアとして公開されているものの、主要なWebブラウザはPowerShellをサポートしていない。要するに、PowerShellからはWebブラウザの制御を行うことができない。

Windowsでサービスの統合に使えるシェルはPowerShellなので、できればPowerShellからWebブラウザの操作をしたい。せめてMicrosoft Edgeだけでも操作できれば、PowerShellを中心として多くの作業の自動化が可能となる。何とかして、これを実現したい。

WebアプリやWebサイト開発業界を見る

さて、ビジネスパーソンはますますインターネットに依存するようになっている。Webサイトはもちろん、インターネットを利用するようなアプリケーションも何かしら使っているだろう。そしてユーザーのニーズに応えるため、開発者は短期間でさまざまなWebアプリケーションやWebサイトを開発する必要性に迫られている。

現在では主要Webブラウザ間で高い互換性が実現しているとはいえ、それでも主要なWebブラウザ実装系はいくつもあり、利用する主なディスプレイサイズも複数存在している。WebアプリケーションやWebサイトを作成する際にはこれらの条件を組み合わせて試験を行わなければならない。だが、全てを手動で行うのはとても大変だ。

Webブラウザに対する操作を自動化し、試験を自動的に実行できるようにしたい。しかも、その試験は複数のWebブラウザに対して実行できるようになっていてほしい――そこで、WebアプリケーションやWebサイト/Webページの開発者に欠かすことができないのが「WebDriver」だ。

Webブラウザを操作する「WebDriver」

Webブラウザ以外のプロセスからのブラウザ操作を実現する、“要”となる規格が「WebDriver」だ。その情報は、執筆時点で次のワーキングドラフトにまとまっている。

  • WebDriver - W3C Working Draft 21 September 2022

    WebDriver - W3C Working Draft 21 September 2022

WebDriverは、外部のプロセスからWebブラウザを操作するためのリモートインタフェースだ。OS、プログラミング言語、Webブラウザなどに依存しないニュートラルなプロトコルで、DOMを介した操作が可能になる。この機能を使うことで、比較的柔軟にWebブラウザに表示されているコンテンツを操作できる。

WebDriverはプロトコル

WebDriverへの対応は、Webブラウザ側が実現する必要がある。現在主要なWebブラウザは全てWebDriverに対応している。対応の程度に差はあるが、主要な機能はほぼどの環境でも使えると思っておいて間違いないだろう。

WebDriverを経由してWebブラウザを操作するには、WebDriverのプロトコルを使ってWebブラウザと“対話”を行う必要がある。通常、こうした操作を自前で実装することはない。面倒すぎるからだ。実際には、WebDriverを実装したライブラリやモジュールといったサードパーティ製のソフトウエアを利用することでWebDriverを経由したWebブラウザの操作を行う。

WebDriverを使うときは「Selenium」

WebDriverに対応した実装系はいくつか存在している。最も有名なのは「Selenium」ではないかと思う。WebアプリケーションやWebページを開発する際に多くの開発者が利用しているライブラリだ。

  • Selenium

    Selenium

Seleniumはデフォルトで次のプログラミング言語に対応している。

  • Java
  • Python
  • C#
  • Ruby
  • JavaScript
  • Kotlin

PowerShellは、Seleniumの対応プログラミング言語には含まれていない。しかし、C#はサポートされている。PowerShellはシェルだが、技術的にはC#および.NETをバックグラウンドとして構築されている。そのため、C#の機能はそのままPowerShellから使用することができる。つまり、C#がサポートされているということは、PowerShellでも利用できるということを意味している。

PowerShellには「Selenium」モジュールがある

実は、PowerShellにはモジュールとして「Selenium」が存在している。Install-Moduleコマンドレットからインストールできるお手軽なモジュールであり、このモジュールを使うとC#の機能を呼び出すよりも簡単にWebDriverを使うことができる。

  • PowerShell Gallery|Selenium 3.0.1

    PowerShell Gallery | Selenium 3.0.1

今のところPowerShellからWebDriverを使うには、このモジュールを使うのが最も簡単な方法ではないかと思う。

WebDriverを使ってMicrosoft Edgeを操作してみよう

  • PowerShellからWebDriverを使ってMicrosoft Edgeを操作するサンプル

    PowerShellからWebDriverを使ってMicrosoft Edgeを操作するサンプル

それでは、PowerShellからWebDriverを使ってMicrosoft Edgeを操作してみよう。汎用的に利用できるようにするにはきちんと準備する必要があるが、今回はその部分は省略してとりあえず使ってみていただきたい。

まず、次のようにInstall-Moduleコマンドレットを実行してPowerShell向けのSeleniumモジュールをインストールする。

Install-Module -Name Selenium -AllowPrerelease -Force

これにより、PowerShell Selenium 4系モジュールがインストールされると、「~\Documents\powershell\Modules\Selenium\4.0.0\assemblies\」に次のような感じでWebDriver関連のドライババイナリやDLLが展開される。

PS C:\Users\daichi> dir .\Documents\powershell\Modules\Selenium\4.0.0\assemblies\

    Directory: C:\Users\daichi\Documents\powershell\Modules\Selenium\4.0.0\assemblies

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          2022/10/13    13:10                linux
d----          2022/10/13    13:10                macos
-a---          2021/03/07    14:57       10100224 chromedriver.exe
-a---          2021/03/07    14:57             65 chromedriver.exe.sha256
-a---          2021/03/07    14:57        3531472 geckodriver.exe
-a---          2021/03/07    14:57             65 geckodriver.exe.sha256
-a---          2021/03/07    14:57        3420672 IEDriverServer.exe
-a---          2021/03/07    14:57             65 IEDriverServer.exe.sha256
-a---          2022/10/10     6:48       15723472 msedgedriver.exe
-a---          2021/03/07    14:57             65 msedgedriver.exe.sha256
-a---          2021/03/07    14:57        1783808 WebDriver.dll
-a---          2021/03/07    14:57             65 WebDriver.dll.sha256
-a---          2021/03/07    14:57          52224 WebDriver.Support.dll
-a---          2021/03/07    14:57             65 WebDriver.Support.dll.sha256

PS C:\Users\daichi>

このドライバはバージョンが古いので、利用するには最新バージョンにアップデートする必要がある。Microsoft EdgeのWebDriver実装は「Microsoft Edge WebDriver - Microsoft Edge Developer」からダウンロードできるので、使っているMicrosoft Edgeと同じバージョンのドライバをダウンロードし、先ほどのディレクトリの「msedgedriver.exe」を上書きする。この操作はMicrosoft Edgeのバージョンが変わるごとに必要になる点に注意が必要だ。

  • Microsoft Edge WebDriver - Microsoft Edge Developer

    Microsoft Edge WebDriver - Microsoft Edge Developer

ここまで準備したらWebDriver経由でMicrosoft Edgeを操作できる。まず、次のようにStart-SeDriverコマンドレットを実行してMicrosoft Edgeを起動する。

Start-SeDriver -Browser Edge -Size '1200,800'
  • WebDriver経由で起動したMicrosoft Edge

    WebDriver経由で起動したMicrosoft Edge

次にページを開く。Set-SeUrlコマンドレットでURLを指定することで、そのURLをMicrosoft Edgeで開くことができる。以下の指定では、TECH+のサイトを開いている。

Set-SeUrl -Url https://news.mynavi.jp/techplus/
  • マイナビニュース TECH+が開かれたMicrosoft Edge

    TECH+が開かれたMicrosoft Edge

今回はこのページの右上に用意されている検索フィールドで検索を行ってみる。次のように操作すると、検索フィールドに検索したい文字列を入力することができる。ここでは「Selenium」という文字列を入力している。

$Element = Get-SeElement -By Id -Value q
Invoke-SeKeys -Element $Element -Keys 'Selenium'
  • 検索フィールドに「Selenium」と入力されたあと

    検索フィールドに「Selenium」と入力された

次は検索の実行だ。以下のようにコマンドレットを実行して検索ボタンを押す。

$Element = Get-SeElement -By XPath -Value '/html/body/header/div[1]/div/div[2]/form/div/input'
Invoke-SeClick -Element $Element -Action Click
  • 検索結果が表示されているところ

こんな感じで、PowerShellからの操作に応じてMicrosoft Edgeの方で操作が行われている点に注目してほしい。通常はユーザーがMicrosoft Edgeに対してインタラクティブに行っている操作だが、それをPowerShellへの入力で行っている。ということは、これらの処理はPowerShellスクリプトに書いて自動化できるのである。

これは強力な機能なので、ぜひともPowerShellからいつでも使えるようにしておきたい。PowerShellユーザーにとって欠かすことのできない機能になるはずなので、次回からじっくり説明を行っていこうと思う。

参考資料