この記事では、2023 年の WebDriver BiDi の新機能の概要を説明します。
WebDriver BiDi とは
WebDriver はブラウザ自動化プロトコルで、W3C 標準として定義され、ChromeDriver、GeckoDriver、WebKitDriver に実装されています。
Chromium には、Chrome DevTools プロトコル(CDP)という独自のブラウザ自動化プロトコルもあります。
この 2 つのプロトコルには根本的な違いがいくつかあります。WebDriver は相互運用可能な標準ですが、このプロトコルは効率が悪く、CDP のような機能がありません。対照的に、CDP はより効率的で強力ですが、相互運用性は劣ります。
そのため、2020 年、W3C Browser Testing and Tools Working Group は、WebDriver Classic プロトコルと CDP プロトコルのギャップを埋める、新しい標準ブラウザ自動化プロトコルである WebDriver BiDi への取り組みを開始しました。両方の長所を活かす詳しい背景情報については、過去にさかのぼって: テスト自動化の進化と WebDriver BiDi - クロスブラウザ自動化の未来をご覧ください。
WebDriver BiDi の取り組みには、標準化作業、ウェブ プラットフォーム テストの作成、さまざまなブラウザ エンジンの実装が含まれます。
私たちは今、どこにいるのでしょうか?
2022 年には、Chrome/ChromeDriver 106 と Firefox 102 の両方で WebDriver BiDi 標準のサポートが開始されました。
それ以来、WebDriver BiDi は一般的なフレームワークで採用され、ロギング サポートなど、要望の多かった機能を利用できるようになったため、開発者が抱える大きな課題に対処しました。
WebDriver BiDi を活用したロギング
一般的な使用例として、コンソールのログ、警告、エラーを伴わず、捕捉されない JavaScript 例外も発生せずに、ウェブページが読み込まれることを自動的に確認します。別のユースケースとして、意図したとおりにウェブページが警告を記録したり、例外をスローしたりするかどうかを確認する自動テストを作成できます。WebDriver Classic では双方向ではないため、これらの問題は解決できません。これを可能にしたのが、WebDriver BiDi です。
以下に、Selenium の JavaScript 言語バインディングを使用した 2 つ目のユースケースの実装例を示します。
import * as assert from 'node:assert';
import { Builder, LogInspector } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome.js';
const driver = new Builder()
.forBrowser('chrome')
.setChromeOptions(new chrome.Options().enableBidi())
.build();
const inspector = await LogInspector(driver);
await inspector.onConsoleEntry((entry) => {
console.log(`Console message received: [${
entry.type}][${entry.level}] ${entry.text}`);
});
await driver.get('https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html');
await driver.findElement({ id: 'consoleLog' }).click();
await driver.quit();
Puppeteer による試験運用版の WebDriver BiDi サポートを使用した例を次に示します。
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
protocol: 'webDriverBiDi',
headless: 'new',
});
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
page.on('console', (message) => {
console.log(`Console message received: [${
message.type()
}] ${message.text()}`);
});
await page.goto(`https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html`);
await page.evaluate(() => {
document.querySelector('#consoleLog').click();
});
await browser.close();
WebdriverIO などの他の抽象化を通じて、同じ機能を使用できます。
共有公開ロードマップ
Google は、W3C ワーキング グループに参加している他のブラウザ ベンダーや業界の関係者と協力し、WebDriver BiDi の仕様を具体化しているところです。FIN11 は最近、ユーザー向けの明確なエンドツーエンドのユースケースに関して、今後の仕様と実装作業を調整する共有ロードマップで合意しました。
相互運用性
ワーキング グループ全体でより多くの機能が規定されているので、WebDriver BiDi プロトコルのウェブ プラットフォーム テストも作成しています。このテストスイートを共有することで、実装の正確性と相互運用性を検証できます。各種ブラウザの最新のテスト結果は、WPT ダッシュボードで確認できます。
WebDriver BiDi のサポート: どのようなことでお困りですか?
WebDriver BiDi によるブラウザ自動化の未来に期待していますか?以下の方法で応援の気持ちを伝えましょう。
- 先行ユーザーとして、WebDriver BiDi の改善にご協力ください。
- 皆に広めましょう。ハッシュタグ
#WebDriverBiDi
を使ってソーシャル メディアでプロジェクトを共有しましょう。 - サポートを依頼する。機能リクエストを提出するか、WebDriver BiDi の採用計画についてお気に入りのツールを確認してください。
- 仕様に関するディスカッションにご参加ください。