WebDriver BiDi: 2023 年のステータス更新

この記事では、2023 年の WebDriver BiDi の新機能の概要を説明します。

WebDriver BiDi とは

WebDriver は W3C 標準として定義されたブラウザ自動化プロトコルで、ChromeDriver、GeckoDriver、WebKitDriver に実装されています。

Chromium には、独自のブラウザ自動化プロトコルである Chrome DevTools Protocol(CDP)もあります。

この 2 つのプロトコルにはいくつかの根本的な違いがあります。WebDriver は相互運用可能な標準ですが、このプロトコルは効率が低く、CDP のような機能がありません。対照的に、CDP はより効率的で強力ですが、相互運用性は劣ります。

そのため、2020 年に W3C Browser Testing and Tools Working GroupWebDriver BiDi の作業を開始しました。これは、WebDriver Classic プロトコルと CDP プロトコルのギャップを埋める新しい標準的なブラウザ自動化プロトコルです。両方の長所を活かす詳細については、A ルックバック: テスト自動化の進化WebDriver BiDi - クロスブラウザ自動化の未来をご覧ください。

WebDriver BiDi には、標準化作業、ウェブ プラットフォーム テストの作成、さまざまなブラウザ エンジンの実装が含まれます。

今どこにいるのか?

2022 年には、Chrome/ChromeDriver 106Firefox 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 の仕様を今でも具体化しています。このグループは最近、ユーザー向けの明確なエンドツーエンドのユースケースを中心として、今後の仕様と実装作業を調整する、共有ロードマップに合意しました。

相互運用性

ワーキング グループが集合的により多くの機能を指定するため、Google は WebDriver BiDi プロトコル用の Web Platform テストも作成します。この共有テストスイートは、実装の正確性と相互運用性を検証するのに役立ちます。各種ブラウザの最新のテスト結果は WPT ダッシュボードで確認できます。

WebDriver BiDi のサポート: どのようにサポートすればよいですか?

WebDriver BiDi によるブラウザ自動化の未来に期待していますか?次の方法で支援の気持ちを示すことができます。

  • 先行ユーザーとしてテスターとして利用して、WebDriver BiDi の未来を形作ってください。
  • 情報を広めましょうハッシュタグ #WebDriverBiDi を使用して、ソーシャル メディアでプロジェクトを共有します。
  • サポートを依頼する。WebDriver BiDi の導入計画について、機能リクエストの提出やお気に入りのツールの確認が可能です。
  • 仕様に関するディスカッションに参加する。