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

この記事では、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 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 の仕様を具体化しているところです。FIN11 は最近、ユーザー向けの明確なエンドツーエンドのユースケースに関して、今後の仕様と実装作業を調整する共有ロードマップで合意しました。

相互運用性

ワーキング グループ全体でより多くの機能が規定されているので、WebDriver BiDi プロトコルのウェブ プラットフォーム テストも作成しています。このテストスイートを共有することで、実装の正確性と相互運用性を検証できます。各種ブラウザの最新のテスト結果は、WPT ダッシュボードで確認できます。

WebDriver BiDi のサポート: どのようなことでお困りですか?

WebDriver BiDi によるブラウザ自動化の未来に期待していますか?以下の方法で応援の気持ちを伝えましょう。

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