WebDriver BiDi:2023 年状态更新

Mathias Bynens
Mathias Bynens

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

什么是 WebDriver BiDi?

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

Chromium 还有自己的专有浏览器自动化协议:Chrome DevTools 协议 (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 协议开发了网络平台测试。这个共享测试套件可帮助我们验证实现的正确性和互操作性。您可以在 WPT 信息中心查看针对各种浏览器的最新测试结果。

支持 WebDriver BiDi:您需要什么帮助?

您对 WebDriver BiDi 实现浏览器自动化的未来充满期待吗?您可以通过以下方式表达您的支持:

  • 成为早期测试人员和采用者,帮助塑造 WebDriver BiDi 的未来。
  • 让全世界都知道!使用 # 标签 #WebDriverBiDi 在社交媒体上分享项目。
  • 寻求支持。提交功能请求,或与您最喜欢的工具联系,了解他们采用 WebDriver BiDi 的计划。
  • 参与规范讨论