WebDriver BiDi:2023 年状态更新

Mathias Bynens
Mathias Bynens

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

什么是 WebDriver BiDi?

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

Chromium 还有自己的专有浏览器自动化协议:Chrome 开发者工具协议 (CDP)。

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

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

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

我们现在处于什么状态?

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

自那以后,WebDriver BiDi 被一些热门框架采用,通过解锁用户呼声很高的功能(例如日志记录支持),解决了开发者的主要痛点。

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

一种常见的使用情形是,自动验证网页加载时是否没有任何控制台日志、警告或错误,以及是否未捕获任何未捕获的 JavaScript 异常。另一个使用场景是编写自动化测试,用于检查网页是否按预期记录了警告或抛出异常。这些问题无法使用传统版 WebDriver 来解决,因为它不是双向的。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 方面的计划。
  • 参与规范讨论