WebDriver BiDi:2023 年状态更新

Mathias Bynens
Mathias Bynens

本文简要介绍了 WebDriver BiDi 在 2023 年的新变化。

什么是 WebDriver BiDi?

WebDriver 是一种浏览器自动化协议,定义为 W3C 标准,在 ChromeDriver、GeckoDriver 和 WebKitDriver 中实现。

Chromium 还有自己的专有浏览器自动化协议:Chrome DevTools 协议 (CDP)。

这两种协议之间存在一些根本差异:WebDriver 是一种可互操作的标准,但该协议效率较低,并且缺少 CDP 所具有的功能。相比之下,CDP 更高效、更强大,但互操作性较低。

因此,在 2020 年,W3C 浏览器测试和工具工作组开始着手开发 WebDriver BiDi,这是一种新的标准浏览器自动化协议,可填补 WebDriver Classic 和 CDP 协议之间的空白。两全其美!如需了解更多背景信息,请参阅回顾历史:测试自动化的演变WebDriver BiDi - 跨浏览器自动化的未来

WebDriver BiDi 工作涉及标准化工作、创建 Web 平台测试以及针对不同浏览器引擎的实现。

我们现在处于什么状态?

2022 年,Chrome/ChromeDriver 106Firefox 102 均支持 WebDriver BiDi 标准。

自那以后,WebDriver BiDi 在热门框架中获得了广泛采用,通过启用日志记录支持等备受开发者欢迎的功能,解决了开发者最头疼的问题。

由 WebDriver BiDi 提供支持的日志记录

一个常见的用例是自动验证网页在加载时是否没有任何控制台日志、警告或错误,以及是否没有任何未捕获的 JavaScript 异常。另一个使用场景是编写自动化测试,用于检查网页是否记录了警告或按预期抛出异常。这些问题无法使用 WebDriver Classic 解决,因为它不是双向的。WebDriver BiDi 现在让这一切成为可能。

下面是使用 Selenium 的 JavaScript 语言绑定实现第二个用例的示例:

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)获得同样的功能。

共享的公开路线图

我们仍在与参与 W3C 工作组的其他浏览器供应商和行业利益相关方合作,完善 WebDriver BiDi 规范。该团队最近就一份共享路线图达成了一致,以便围绕面向用户的明确端到端用例调整即将发布的规范和实现工作。

互操作性

随着该工作组共同指定了更多功能,我们还针对 WebDriver BiDi 协议创建了 Web 平台测试。此共享测试套件有助于我们验证实现的正确性和互操作性。您可以在 WPT 信息中心查看各种浏览器的最新测试结果。

支持 WebDriver BiDi:您可以提供哪些帮助?

您是否对 WebDriver BiDi 赋予浏览器自动化功能的未来充满期待?您可以通过以下方式表达您的支持:

  • 成为早期测试人员和使用者,帮助塑造 WebDriver BiDi 的未来。
  • 广而告之!使用 #WebDriverBiDi 标签在社交媒体上分享项目。
  • 寻求支持。提交功能请求,或与您喜爱的工具联系,了解其采用 WebDriver BiDi 的计划。
  • 参与规范讨论