什么是 WebDriver BiDi?浏览器事件和自动化

什么是 WebDriver BiDi?双向浏览器自动化

无抓取抓取浏览器为经过验证的协议和事件要求的自动化客户端提供托管的浏览器基础设施。

简而言之

  • WebDriver BiDi 是一种双向浏览器自动化协议。 它使用 WebSocket 连接,因此客户端可以发送异步命令,浏览器可以实时发出已订阅的事件。
  • BiDi 扩展了 WebDriver 家族。 它保留会话和能力概念,同时添加模块、命令、事件、订阅、浏览上下文、领域和用户上下文。
  • BiDi 解决了经典 WebDriver 的事件空白。 控制台条目、网络活动、上下文更改和其他信号可以从浏览器流向客户端,而无需持续轮询。
  • BiDi 不仅仅是重新命名的 CDP。 它旨在实现跨浏览器标准化,而 CDP 是一个特定于 Chrome 的协议,拥有更广泛的已建立的 Chrome 调试面。
  • 支持是逐个功能的。 该规范仍然是 W3C 工作草案,浏览器加客户端实现可以在任何时候覆盖不同的模块和命令。

WebDriver BiDi 为浏览器控制添加了实时事件通道

经典 WebDriver 基于离散客户端请求和远程响应构建。该模型处理导航、输入、元素、窗口、cookie、屏幕截图和脚本很好,但现代浏览器是事件驱动的。网络请求开始和结束,日志出现,浏览上下文打开或关闭,对话框显示,下载开始,脚本独立于下一个客户端命令运行。WebDriver BiDi 创建了一个持久的双向连接,以便客户端可以订阅这些更改并在发生时接收它们。

W3C WebDriver BiDi 规范 将 WebDriver BiDi 定义为远程控制用户代理的机制,并解释双向通信更好地匹配浏览器 DOM 的事件特性。该文档正在 W3C 推荐轨道上,但仍然是一个工作草案。因此,生产设计应将最新规范和当前实现视为移动表面,并验证每个所需模块。

命令、结果、错误和事件共享一个 WebSocket

BiDi 消息识别一个方法,例如模块命令,并携带参数。命令具有客户端控制的标识符,因此即使几个操作同时运行并且完成顺序不同,结果或错误也可以匹配。事件携带方法名称和数据,但不是对特定命令的响应。客户端订阅事件名称,选定与浏览或用户上下文相关联,并可以在不再需要信号时取消订阅。

MDN WebDriver BiDi 参考 将 BiDi 描述为基于 WebSocket 的、事件驱动的 WebDriver 变体,并提供模块、命令和事件的参考页面。持久连接改变了客户端架构:消息调度、订阅生命周期、顺序、缓冲和清理成为明确的关注点。客户端不能仅仅依赖事件到达顺序来证明应用程序的最终业务状态。

  • 模块。 一个命名空间将相关命令和事件分组,如会话、浏览器、浏览上下文、网络、脚本、日志、存储或输入。
  • 命令。 异步客户端请求携带标识符、方法和参数,稍后接收匹配的结果或错误。
  • 事件。 浏览器起源的通知报告已订阅的活动,而不与新的客户端请求挂钩。
  • 订阅。 客户端选择希望远程端发出的事件名称和可选的上下文范围。
  • 上下文和领域。 浏览上下文表示标签页或框架,而脚本领域表示在这些上下文内的执行环境。

BiDi 可以通过 WebDriver 会话或仅 BiDi 路径启动

客户端在创建 WebDriver 会话时可以请求 WebSocket URL 功能。支持的远程端返回一个连接 URL,并将会话标记为 BiDi 启用。规范还允许实现通过带外连接 URL 暴露仅 BiDi 会话。一旦连接,客户端可以管理订阅并发布模块命令。实际的启动路径取决于浏览器、驱动程序、客户端库和远程服务。

官方 Puppeteer WebDriver BiDi 支持指南 解释了 Puppeteer 如何使用 WebDriver BiDi 进行 Chrome 和 Firefox,并指出不支持的功能会引发明确错误。这是渐进式实现的一个实际示例:客户端可以在保留 CDP 用于 BiDi 尚不涵盖的 Chrome 特性时,暴露一个有用的 BiDi 路径。架构应允许能力检查或范围回退,而不将部分支持视为完整协议对等。

WebDriver Classic、WebDriver BiDi 和 CDP 服务不同的目标

这些协议相互重叠,但它们的传输、事件模型、标准化范围和实现成熟度各有不同。

协议最好理解为
WebDriver classic一种基于标准的跨浏览器 HTTP 命令和响应协议,用于常见的浏览器自动化操作。
WebDriver BiDi一种标准轨道跨浏览器 WebSocket 协议,用于异步命令、订阅和浏览器事件。
Chrome DevTools Protocol一种特定于 Chrome 的检查、调试、分析和自动化协议,具有深入的领域覆盖。
经典加 BiDi一种过渡和实用的组合,其中已有命令与事件驱动的 BiDi 功能共存。
BiDi 客户端库一个更高级的 API,将协议模块和事件流映射到项目的语言和生命周期模型中。
远程浏览器服务一个基础设施层,其广告端点必须与客户端所需的协议模块进行检查。

双向事件改变自动化设计的地方

当浏览器源活动是结果或同步模型的一部分而不是附带调试数据时,BiDi 是有价值的。

控制台和日志观察

客户端可以订阅日志事件,并将浏览器消息与生成它们的浏览上下文和自动化步骤关联。

网络感知自动化

网络模块可以公开请求和响应活动以便观察、拦截、身份验证或同步(如果已实施)。

上下文生命周期跟踪

事件可以报告标签、窗口和框架,当浏览上下文被创建、导航或销毁时。

脚本执行和领域

BiDi 可以评估或调用定义的脚本领域中的函数,并返回值或具有更清晰执行范围的远程引用。

规范和实现仍在发展中

W3C 工作草案可能会改变,且实现通常一次只落地一个模块或命令。浏览器支持、驱动程序支持、客户端绑定和远程服务可能在不同的时间表上移动。因此,公共兼容性声明需要日期和内部工程笔记中的功能列表,即使一个常青的维基应该避免脆弱的版本表。测试应用程序依赖的确切订阅、命令、参数和结果形状。

MDN WebDriver BiDi 模块参考 列出 BiDi 模块及其命令和事件命名空间。该列表对于发现很有用,但并不能证明每个浏览器实现了每个条目。请咨询实现结果、浏览器发布信息和客户端库的支持表,然后在生产环境中进行以符合性为重点的冒烟测试。

WebDriver BiDi 采用清单

根据所需能力而非协议标签采用 BiDi。测试应证明传输、命令、事件、上下文和清理行为的端到端。

  1. 命名所需的模块。 列出工作流程所需的确切会话、浏览器、浏览上下文、网络、脚本、日志、存储、输入或其他命令和事件。
  2. 确认启动路径。 验证客户端是否通过经典会话请求 webSocketUrl、连接到仅 BiDi 的端点,或让框架管理谈判。
  3. 测试订阅。 订阅和取消订阅预期的事件,将其作用范围限制到相关上下文,并确认无关的会话不会将事件泄漏到处理程序。
  4. 处理并发。 将结果匹配到命令标识符,允许无序完成,并定义当事件在长时间运行的命令期间到达时消息调度的行为。
  5. 建模上下文生命周期。 显式跟踪标签、框架、用户上下文和脚本领域,以便事件和远程引用不在其上下文被销毁后应用。
  6. 绑定事件量。 仅选择必要的事件类型,及早过滤,定义缓冲和反向压力,避免保留包含无关的个人或秘密数据的有效载荷。
  7. 保留支持的路径。 对于所选浏览器和客户端缺失的承载特性,保持经典 WebDriver 或 CDP 适配器,进行使边界可见的测试。
  8. 重新验证升级。 当浏览器、驱动程序、客户端库、远程服务或规范实现发生变化时,运行协议冒烟测试。

WebDriver BiDi 和托管浏览器基础设施

托管浏览器服务可以在客户端应用程序在其他地方运行时托管远程端,但必须明确验证端点协议和支持的模块。无残留抓取浏览器为支持的自动化客户端提供远程浏览器基础设施;除非当前文档和实时兼容性测试确认该路径,否则不应将其描述为 BiDi 端点。

使用服务文档确定支持的客户端和连接模型,然后在采用之前测试所有必需的事件和命令。查看当前的 无残留抓取浏览器产品概览, 无残留抓取浏览器入门文档, 和 无残留定价 再选择一个操作模型。

结论:BiDi 将浏览器事件引入一个标准化路径。

WebDriver BiDi 添加了一个持久的、双向的、事件驱动的连接到 WebDriver 系列中。模块组织命令和事件,订阅控制浏览器发出的内容,异步命令标识符允许多个操作同时进行。该模型更适合于控制台、网络、上下文和脚本活动,而不仅仅是经典的轮询。

请谨慎采纳。该规范仍然是工作草案,支持是按特性进行的,CDP 或经典 WebDriver 可能仍然需要执行操作。一个小的兼容性套件应该定义浏览器、驱动程序、客户端和远程服务之间的真实合同。

准备测试远程自动化协议吗?

创建一个 Scrapeless 账户,并在扩大之前验证受支持的客户端连接和事件要求。

开始免费→

常见问题

WebDriver BiDi 中的 BiDi 代表什么?

BiDi 代表双向。客户端可以向浏览器发送异步命令,浏览器可以通过相同的 WebSocket 连接发送订阅的事件。这与经典 WebDriver 的主要客户端发起的 HTTP 命令响应模型不同。

WebDriver BiDi 完成了吗?

没有。WebDriver BiDi 仍然是 W3C 推荐轨道上的工作草案。浏览器和客户端库实现了有用的部分,但支持因模块、命令、事件、版本和连接路径而异。请验证工作流程所需的确切功能集。

WebDriver BiDi 取代经典 WebDriver 吗?

不会立即。经典 WebDriver 在常见的浏览器操作中仍然被广泛实现,客户端可以将经典会话与 BiDi 事件功能结合使用。替代取决于项目所需的命令和环境的完整支持。

WebDriver BiDi 和 Chrome 开发者工具协议是一样的吗?

不是。CDP 是一种针对调试、检查、分析和自动化的 Chrome 特定协议。WebDriver BiDi 被设计为跨浏览器的标准。它们在网络、脚本、日志和上下文能力上有重叠,但在范围、名称、语义和成熟度上有所不同。

哪些工具支持 WebDriver BiDi?

现代浏览器自动化生态系统中存在支持,包括 Selenium 和 Puppeteer,但这是特性特定的。请参考当前的浏览器和客户端文档,并针对确切的浏览器环境运行所需的命令和订阅,而不是依赖一般的支持徽章。

参考文献