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

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

WebDriver BiDi とは

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

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

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

そのため、2020 年に W3C ブラウザ テストとツールのワーキング グループは、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 仕様をさらに充実させています。このグループは最近、共有ロードマップに合意し、ユーザー向けの明確なエンドツーエンドのユースケースを中心に、今後の仕様と実装作業を調整しました。

相互運用性

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

WebDriver の BiDi のサポート: どのように貢献できますか?

WebDriver BiDi によるブラウザ自動化の将来に期待していますか?支援を示す方法は次のとおりです。

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