WebDriver
WebDriver是W3C定义的一套浏览器自动化接口与线协议(wire protocol),用于让浏览器之外的进程远程检查并控制浏览器。它由Selenium WebDriver演化而来,2018年6月成为W3C正式推荐标准,是跨浏览器测试的基础设施;其后新增的WebDriver BiDi则以双向通信补充了经典版本的命令-响应模式。
定义
WebDriver是一种远程控制接口,能够对用户代理(user agent,即浏览器)进行检测与控制,并提供一套与平台无关、与编程语言无关的线协议,使进程外的程序可以远程指挥浏览器的行为[1]。它同时给出了一组用于发现和操作网页 DOM 元素、控制用户代理行为的接口[2]。
按规范的设计意图,WebDriver主要服务于编写自动化测试的 Web 作者,使其能从独立的控制进程驱动浏览器,但也可用于让浏览器内的脚本控制另一浏览器[1]。规范由其派生自的 Selenium WebDriver 框架演化而来,并刻意保持兼容,以避免既有用户受到意外破坏[3]。
该标准目前有两种形态:基于 HTTP 的 WebDriver classic,以及基于 WebSocket、可双向事件驱动通信的 WebDriver BiDi[1]。
原理
WebDriver采用客户端与远端(remote end)分离的结构。自动化脚本通过客户端库把操作翻译成 HTTP 请求,发往驱动程序所在的本地服务器;驱动程序再以各浏览器特有的内部机制与浏览器通信,从而完成点击、输入、导航等动作。以 Safari 为例,其驱动 safaridriver 就是托管一个本地 Web 服务器、接收 REST 风格 HTTP 请求的 REST API[4]。
会话是协议的基本单位。创建会话时客户端以 POST 方式请求 /session,并提交一组称为能力(capabilities)的键值对,用以描述所期望的浏览器名称、版本、平台、页面加载策略等特性;远端按这些要求协商,成功后返回一个 UUID 标识的会话号,后续命令都在该会话下路由[5]。能力协商通过 alwaysMatch 与 firstMatch 两个字段完成,前者为必须满足的条件,后者给出依次尝试的备选组合[6]。
标准化的命令覆盖会话、超时、导航、窗口与框架切换、元素查找与交互、执行脚本、Cookie、输入动作、用户提示框与截屏等类别,每条命令对应固定的 HTTP 方法与 URI 模板,出错时返回带错误码的 JSON 报文[7]。由于命令含义由规范而非浏览器厂商决定,同一份测试脚本可以不加修改地跑在不同浏览器上[4]。
发展历程
WebDriver的思路源于对 Selenium 早期方案的改进。Selenium 于 2004 年由在 ThoughtWorks 工作的杰森·哈金斯(Jason Huggins)发起,以浏览器内运行的 JavaScript 模拟用户操作,因而受同源策略与 JavaScript 沙箱限制[8]。2007 年 1 月 3 日,西蒙·斯图尔特(Simon Stewart)提交了 WebDriver 的首个代码,改为通过浏览器原生接口从沙箱之外直接控制浏览器[9]。
2009 年 8 月,两个项目宣布合并,斯图尔特在邮件中说明:WebDriver 补足了 Selenium 绕过 JavaScript 沙箱的短板,而 Selenium 补足了 WebDriver 支持浏览器范围有限的问题。合并成果 Selenium 2(即 Selenium WebDriver)于 2011 年发布,支持 Firefox、IE、Opera、Chrome 等浏览器的驱动,并复用操作系统级调用模拟用户输入。
此后标准化的推进由万维网联盟(W3C)的浏览器测试和工具工作组承担,该工作组的目标是为浏览器中运行的 Web 应用测试自动化产出技术[10]。2018 年 6 月 5 日,WebDriver 正式成为 W3C 推荐标准,发布说明强调其允许进程外程序以模拟真人操作的方式远程控制浏览器[11]。为弥补经典版本无法监听页面事件的问题,工作组又启动了引入双向通信机制的 WebDriver 双向协议(WebDriver BiDi)[10]。
应用
最典型的用途是 Web 应用的跨浏览器回归测试:测试代码在多种浏览器与操作系统组合上重复执行同一套操作步骤,验证页面行为一致[1]。规范也明确提到,除测试外还可服务于监控、负载测试一类依赖浏览器自动化的工具[3]。
围绕该协议形成了多个客户端与工具生态,例如 Selenium 各语言客户端库、WebdriverIO、Appium 等把不同浏览器的驱动统一在同一套 API 之下。浏览器厂商各自提供实现:Chrome 的 ChromeDriver 实现 W3C WebDriver 与 WebDriver BiDi,并通过 goog: 前缀的扩展能力加入 Chromium 专有配置;Safari 使用 safaridriver,并把测试限制在隔离的自动化窗口中运行,以免触及正常浏览数据。
由于协议本身与语言无关,客户端可以先用 Python、Java、C#、Ruby 等语言编写,再在运行时决定目标浏览器[4]。在分布式场景中,请求还可经由中间节点按能力协商结果路由到合适的驱动实例[6]。
局限
经典 WebDriver 基于 HTTP 的命令-响应模型,一次操作往往对应多次请求往返,执行速度相对较慢,也不便于订阅浏览器侧发生的事件。因此它在控制台消息捕获、网络请求拦截、设备模式与地理位置模拟等底层控制能力上存在空缺,这类需求常转向浏览器私有的调试协议。
跨浏览器一致性依赖各家驱动的实现质量。规范文档本身也指出,并非所有命令都能在所有实现上取得相同行为,扩展命令与扩展能力又由厂商自行定义,只有加了厂商前缀的键才可避免冲突[12]。
安全模型对可自动化范围构成约束。部分实现把自动化会话与正常浏览数据隔离,并限制同一浏览器实例同时只接受一个会话,以贴近真实用户在窗口环境中的可操作范围[4]。这些限制保证了模拟的真实性,也意味着高并发、多会话的调度需要借助网格等外部机制。
参见
-
Selenium —— WebDriver 的技术前身之一,二者合并为 Selenium WebDriver。
-
WebDriver BiDi —— 在 WebDriver 基础上引入双向通信的扩展协议。
-
万维网联盟 —— 负责维护 WebDriver 标准的国际标准化组织。
-
ChromeDriver —— 面向 Chromium 系列浏览器的 WebDriver 实现。
-
跨浏览器测试 —— WebDriver 最主要的应用场景。
-
网页浏览器 —— WebDriver 所控制的目标用户代理。
参考资料
- WebDriver [引用日期2026-10-29]
- Transition Request: WebDriver to Recommendation [引用日期2026-10-29]
- WebDriver [引用日期2026-10-29]
- WebDriver | Apple Developer Documentation [引用日期2026-10-29]
- WebDriver - If secondary is undefined, return result [引用日期2026-10-29]
- 功能 - WebDriver | MDN [引用日期2026-10-29]
- googlesource.com 上的网页 [引用日期2026-10-29]
- Name of system: Selenium WebDriver [引用日期2026-10-29]
- Stepping Down, Stepping Up [引用日期2026-10-29]
- Browser Testing and Tools Working Group Charter [引用日期2026-10-29]
- WebDriver is now a W3C Recommendation [引用日期2026-10-29]
- WebDriver [引用日期2026-10-29]