この記事では、2023 年の WebDriver BiDi の新機能の概要について説明します。
WebDriver BiDi とは
WebDriver は、W3C 標準として定義されたブラウザ自動化プロトコルであり、ChromeDriver、GeckoDriver、WebKitDriver に実装されています。
Chromium には、独自のブラウザ自動化プロトコルである Chrome DevTools プロトコル(CDP)もあります。
この 2 つのプロトコルには根本的な違いがあります。WebDriver は相互運用可能な標準ですが、プロトコルの効率が低く、CDP にはない機能があります。一方、CDP はより効率的で強力ですが、相互運用性は低くなります。
そのため、2020 年に W3C ブラウザ テストとツールのワーキング グループは、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 仕様をさらに充実させています。このグループは最近、共有ロードマップに合意し、ユーザー向けの明確なエンドツーエンドのユースケースを中心に、今後の仕様と実装作業を調整しました。
相互運用性
ワーキング グループがより多くの機能を共同で仕様化すると、WebDriver BiDi プロトコル用の ウェブ プラットフォーム テストも作成されます。この共有テストスイートは、実装の正確性と相互運用性を検証するのに役立ちます。さまざまなブラウザの最新のテスト結果は、WPT ダッシュボードで確認できます。
WebDriver の BiDi のサポート: どのように貢献できますか?
WebDriver BiDi によるブラウザ自動化の将来に期待していますか?支援を示す方法は次のとおりです。
- 早期テスターと早期ユーザーとして、WebDriver BiDi の未来を一緒に形作っていきましょう。
- 広めてください!ハッシュタグ
#WebDriverBiDi
を使用して、プロジェクトをソーシャル メディアで共有します。 - サポートを依頼する。機能リクエストを送信するか、お気に入りのツールで WebDriver BiDi の導入計画を確認してください。
- 仕様に関するディスカッションに参加する。