什么是 WebDriver?会话、命令与浏览器自动化

什么是 WebDriver?

Scrapeless Agent Browser 通过其文档化的连接接口,为自动化客户端提供托管的云浏览器。

WebDriver 是用于网页浏览器的标准化远程控制接口。浏览器外部的程序使用 WebDriver 命令来导航、定位元素、执行交互以及检查浏览器状态。该接口与编程语言无关,使不同编程语言的客户端库能够通过通用的协议模型来表达浏览器操作。

WebDriver 通常是通过 Selenium 接触到的,但这两个术语指代的是不同的层次。WebDriver 定义了浏览器控制的契约;Selenium 提供利用浏览器自动化接口的库和基础设施。特定浏览器的驱动程序为某个特定的浏览器环境实现远程端。

WebDriver 命令如何到达浏览器

WebDriver 客户端向控制浏览器的远程端发送命令。 WebDriver 协议 定义了这种关系以及命令和响应的行为。

客户端库为你提供编程语言的方法。远程端解释协议请求并执行相应的浏览器操作。然后浏览器进行导航、读取状态或与文档交互,远程端返回结果或错误。

远程端可以在本地访问,也可以通过网络服务访问。“远程”描述的是控制边界;它并不要求浏览器必须位于公共云中。即使是在同一台计算机上的驱动程序进程,依然处于被控制浏览器之外。

这种分离使组件的归属变得重要。断言属于测试框架,选择器属于应用程序逻辑,协议错误属于命令交互,而页面渲染则属于浏览器。应从产生可观察故障的那一层开始进行诊断。

会话建立自动化关系

WebDriver 会话建立了客户端与浏览器环境之间的关系。后续命令会在该会话中运行,直到会话结束。

会话创建包括能力协商。客户端会声明其所需的浏览器环境和支持的选项,而远端则决定是否能够创建一个合适的会话。返回的能力描述了实际建立的会话。

会话标识符是自动化协议使用的引用。它与网站的登录 Cookie 并不相同。浏览器在显示未经过身份验证的页面时,仍然可以具有有效的 WebDriver 会话,而当自动化仍然保持连接时,网站也可能使身份验证失效。

当任务完成时,请显式终止会话。关闭一个窗口与结束自动化会话是不同的操作。清理策略应同时考虑与该任务相关的窗口、浏览器进程以及任何远程资源。

驱动程序和客户端库是不同的组件

客户端库使用你的编程语言来表达浏览器命令,而驱动程序则为浏览器提供远程实现。兼容的组件必须就工作流所需的协议行为达成一致。

The ChromeDriver 实现 为 Chrome 提供浏览器自动化支持。其他浏览器有各自的实现和支持细节。不要假设某个浏览器的驱动程序可以控制所有浏览器产品。

一个库可能有助于获取或选择驱动程序,但这种便利并不会将版本兼容性从部署过程中移除。在复现故障时,记录实际使用的浏览器和驱动程序环境。

层责任典型问题
应用程序或测试定义所需的工作流程和断言用户应该看到什么?
客户端库表达和发送自动化命令这种语言如何暴露该操作?
驱动程序或远程端实现浏览器控制命令该环境可以执行该操作吗?
浏览器加载并执行网页内容实际渲染的是哪个文档和状态?

元素引用属于文档生命周期

WebDriver 元素引用用于标识在特定浏览器上下文和文档状态中找到的元素。该引用并不是一个永久的定位器,不能保证之后处于相同视觉位置的内容仍然对应同一元素。

一次导航会替换整个文档。客户端应用程序也可以在不更改页面 URL 的情况下替换某个元素。当先前引用的元素被移除时,若继续使用该引用,就可能产生“过期元素”(stale-element)错误。

围绕稳定含义设计交互。找到与预期操作相关联的控件,验证相关页面状态,并在已知的文档或组件替换后重新获取元素。不要将已存储的元素句柄视为持久的业务标识符。

框架选择也同样重要。iframe 内的节点属于子文档,因此当前的浏览上下文决定了元素搜索发生的位置。在错误的框架中使用正确的选择器,仍然会指向错误的文档。

等待应描述应用程序就绪状态

一个有用的等待应该描述执行下一步操作所需的应用程序条件。浏览器导航完成与业务状态完成通常是两个不同的事件。

例如,结果容器可能在记录到达之前就已存在。按钮可能已经可见,但加载遮罩仍在拦截交互。页面标题可能已经正确,而授权提示占据了主内容区域。

选择与操作相匹配的条件。在提取记录之前,确认记录标识和所需字段已存在。在选择控件之前,确认它在预期的上下文和状态下可用。避免仅用任意延迟作为应用程序已就绪的唯一依据。

让超时诊断具体化。当条件未满足时,检查最终 URL、可见页面、frame 和预期状态。延长超时时间并不能修复错误的选择器,也不能提供缺失的授权。

不同的等待机制有不同的语义,随意组合会让执行过程难以推理。使用客户端库已文档化的行为,并采用一致的应用级等待策略。

WebDriver 与 Selenium 的关系

Selenium 是一个自动化生态系统,其中包括 WebDriver 客户端支持和额外基础设施。 Selenium WebDriver 架构 解释了它的库如何通过受支持的自动化实现来驱动浏览器。

在指定需求时,这一区别很重要。“支持 Selenium”可能指的是客户端库、远程服务器或某个特定的浏览器通路。一个有用的需求应指明编程语言、浏览器、连接类型以及作业所需的操作。

Selenium Grid 负责在可用的执行环境之间分配浏览器会话。分发本身不会验证页面提取的数据,也不会判断定位器是否正确。将这些检查保留在拥有应用逻辑的作业内。

测试框架在浏览器交互之外增加断言、报告和套件组织。即使 WebDriver 成功执行了某个操作,如果应用程序产生了错误结果,断言仍然可能失败。这是一种有用的区分,而不是矛盾。

WebDriver BiDi 和 CDP 需要单独的兼容性检查

WebDriver BiDi 和 CDP 是具有自身能力和支持边界的附加协议面。不能仅凭存在一个通用远程浏览器连接就推断它们已被支持。

BiDi 增加了用于命令和浏览器生成事件的双向模型。CDP 暴露面向 DevTools 的浏览器控制。一个客户端生态系统可以使用多种接口,但你的应用仍然需要所选浏览器和远程端点支持确切的操作。

当应用程序依赖网络观测或控制台事件时,要显式整理这些需求。将协议特性、客户端 API、浏览器版本和远程提供商通路作为组合来检查。

不要把产品宽泛的框架兼容性声明转化为对每个协议的已测试支持声明。一个有文档记录的连接示例只是该连接路径的证据,而不是不相关接口的证据。

托管浏览器运行环境是一个单独的决策

托管浏览器运行环境决定由谁来运营浏览器环境;WebDriver 则决定浏览器控制接口。托管决策和协议决策应一起评估,而不要将它们视为同一件事。

Scrapeless Agent Browser 提供托管的浏览器执行,其 浏览器概览 解释了这一基础设施角色。针对你选择的工作流使用当前已文档化的连接接口,并在规划部署之前先确立协议兼容性。

“ Selenium 抓取讨论 ”提供了与浏览器驱动数据收集相关的背景。只有在明确浏览器工作负载和连接需求之后,才查看 Scrapeless 定价 。托管无法修复会读取错误记录的提取规则。

结论

WebDriver 为外部程序提供了一种标准化的浏览器控制方式。可靠使用取决于清晰的会话生命周期、兼容的组件、面向文档的元素处理,以及与应用状态绑定的等待。在需求中指明实际的协议和环境,从而让浏览器托管和客户端库的选择保持可测试。

定义你的浏览器执行需求

根据你的应用实际需要的连接接口和生命周期来评估 Scrapeless Agent Browser。

立即注册即可获得 $5 in free credit — 无需信用卡.

领取你的 $5 额度 →

常见问题

问:WebDriver 是一种编程语言吗?

WebDriver 是一种浏览器控制接口和协议,而不是编程语言。客户端库通过自动化应用所使用的语言来暴露这些操作。

问:Selenium 和 WebDriver 是同一回事吗?

Selenium 和 WebDriver 指代不同层次。Selenium 提供自动化生态系统,而 WebDriver 定义其客户端所使用的浏览器控制约定。

问:为什么之前找到的元素会变成陈旧(stale)?

当元素所引用的文档节点对当前页面状态不再有效时,该元素就会变成陈旧。导航或组件替换可以将该节点从文档中分离,即使类似的控件仍然可见。

问:WebDriver 会话是否意味着网站登录已处于激活状态?

WebDriver 会话不会建立网站登录。自动化连接状态和应用程序认证是两个独立的生命周期。

问:WebDriver 能否控制同一台计算机上的浏览器?

WebDriver 可以通过本地远程端控制同一台计算机上的浏览器。协议边界独立于浏览器的物理位置。

参考资料