Webブラウザでの自動テストやスクレイピングに必須のツールとしてSeleniumがあります。このSeleniumの最近のバージョンアップで頻繁に機能が追加されているのが「WebDriver BiDi」に関するものです。具体的にどのような機能なのかを知っておきましょう。
Webブラウザでのテスト自動化
WebサイトやWebアプリを開発したとき、Webブラウザでその動作を確認します。既存の内容から変更したとき、正しく変更できたことを確認するだけでなく、変更すべきでないところが変わっていないことも確認しなければなりません。こういったチェックを1ページずつ手作業で開いて確認するのは大変なので、ページ数が多いと自動化したくなります。
また、複数のWebページから情報を抽出したいときはスクレイピングやクローリングといった手法を使います。これも自動化の一種です。
このようなWeb環境での処理を自動化するとき、独自のプログラムを開発する方法もありますが、「Selenium」などの便利なツールがよく使われています。
たとえば、PythonからSeleniumを使った処理を実行するのであれば、次のようなプログラムが考えられます。これは、Seleniumを読み込んで、Chromeで「itstaffingエンジニアスタイル」のサイトを開き、そのページのタイトルを出力するものです。
sample.py
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.r-staffing.co.jp/engineer/")
print(driver.title)
driver.quit()
このプログラムを実行するには、次のようにSeleniumをインストールして、Pythonで実行します(2回目以降は2行目だけ実行)。
$ pip install selenium
$ python3 sample.py
これにより、自動的にChromeを操作し、開いたページのタイトルを出力できます。今回は『itstaffing エンジニアスタイル』のように表示されます。このように数行のプログラムを書くだけで、PythonなどのプログラムからWebブラウザを操作して、ページのタイトルやページの要素を手軽に取得できることが特徴です。
このプログラムの1行目にwebdriverという単語が登場しますが、こういったツールを支える技術が「WebDriver」です。
Google ChromeやFirefox、Microsoft Edge、SafariなどさまざまなWebブラウザに対応したWebDriverがそれぞれ開発されており、そのAPIやプロトコルが規定されています。
デバッグに便利な「Chrome DevTools」
WebDriverはさまざまなWebブラウザを手軽に操作できて便利な一方で、Webブラウザに対してコマンドを送信し、その応答を得るだけです。このため、Webブラウザ側で何らかのイベントが発生したときに、その呼び出し元のプログラムを制御するなどの双方向の処理はできません。
また、一般的なHTTPの通信を使っているため処理が遅いものです。コマンドを実行するたびに新たにWebサーバーと接続しますし、Webページの表示が完了するまでHTMLの要素を操作できません。
そんな中、WebブラウザのChromeには「Chrome DevTools」という開発者向けの機能が用意されています。
- HTMLの要素を選択する
- コンソールのメッセージを監視する
- ネットワークの通信を確認する
といったデバッグに必要な機能が用意されており、多くの開発者が使っています。
さらに、このChrome DevToolsに外部からアクセスするプロトコルとしてCDP(Chrome DevTools Protocol)があります。このCDPでは、クライアントとサーバーが双方向に通信できる「WebSocket」という技術を使っています。WebDriverは使わずにアクセスするため、処理も高速になります。
このCDPを使って自動化するツールとしてPuppeteerなどが開発されていました。
CDPのChrome依存と、WebDriver BiDi
CDPは便利な仕組みですが、操作するWebブラウザがChromeに依存してしまうという問題があります。そこでさまざまなWebブラウザでCDPと同様の仕組みを実装できるように策定が進んでいるのが「WebDriver BiDi」です。BiDiは「Bidirectional(バイディレクショナル)」の略で、名前の通り双方向のプロトコルです。
たとえば、Webブラウザ側でJavaScriptの処理を実行していて、エラーが発生したときにWebブラウザのコンソールにログを出力するようなプログラムがあったとします。この場合、いつエラーが起きるのか、これまでの自動化ツール側ではわかりませんでした。
しかし、双方向のプロトコルで、ブラウザのコンソールにアクセスできるWebDriver BiDiであれば、ログが出力されたときに、それを自動化ツール側に通知できます。この内容を受けて、自動化ツール側で独自の処理を実装できるのです。
そして、これはCDPのようにChromeに特化したものではなく、さまざまなWebブラウザでCDPのような動作を実現できるようになります。すでにChromeやFirefoxが対応済みで、今後は他のWebブラウザも対応することが期待されています。
自動化ツール側として、上記のPuppeteer も対応していますし、Seleniumの変更履歴を見ると、Ver 4.18以降にWebDriver BiDiについての変更が多く追加されていることがわかります。
今後もPuppeteerやSeleniumだけでなく、さまざまなフレームワークが登場することが期待されています。Webブラウザでのテストの自動化やスクレイピングなどでは、このWebDriver BiDiにも注目していきましょう。
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピュータを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『Pythonではじめるアルゴリズム入門』『図解まるわかり プログラミングのしくみ』『「技術書」の読書術 達人が教える選び方・読み方・情報発信&共有のコツとテクニック』(翔泳社)、最新刊の『データ分析に強くなるSQLレシピ 小規模データの前処理・分析の書き方&テクニック』(インプレス)がある。
※本記事に記載されている会社名、製品名はそれぞれ各社の商標および登録商標です。
※本稿に記載されている情報は2024年9月時点のものです。