移除旧版协议支持

Selenium 4.9 将仅支持符合 W3C 标准的 WebDriver 语法

Selenium 团队以其对向后兼容性的重视而自豪。Java 绑定尤其如此,多年来一直非常注重确保很少有重大更改。15 年前编写的 Selenium 代码仍然可以使用 Selenium 4 库运行!提供如此多的支持带来了巨大的维护负担,我们需要能够适当地满足我们绝大多数用户的需求。

总结

  • Java Selenium 4.9 将删除对旧版 JSON Wire 协议 的支持(其他语言已经删除了此支持)
  • 协议转换将在 Selenium 4.9 Grid 中停止
  • 您可以通过使用 浏览器选项类 而不是已弃用的所需功能类(并避免直接使用“设置功能”方法)来确保您的会话符合 W3C 标准
  • 如果您依赖当前的协议转换功能,并且它对您有效,则可以继续将其与 Selenium Grid 4.8 一起使用

在过去七年的 Selenium 开发中,最大的挑战是将底层实现从旧版 JSON Wire 协议 过渡到新的标准化 W3C WebDriver 协议。由于 WebDriver 规范当时正在积极开发中,Selenium 3 同时支持这两种协议。我们实现了“握手”代码来确定使用哪种协议。启动会话时,Selenium 会将提供的功能打包为旧版和 W3C 格式,将其发送到驱动程序/服务器,并使用返回的协议。这在大多数情况下都有效。对于许多用户而言,无需进行任何更改即可从新的浏览器(Firefox 47+ 和 Chrome 75+)获得符合 W3C 标准的会话。

对于 Java 绑定,决定采取更进一步的方法。该代码不仅会以两种格式发送所提供的功能,还会代表用户将功能从旧版协议转换为 W3C 协议。Selenium Grid 使用此代码,因此,无论哪个客户端语言将旧版功能发送给它,Grid 都会将其转换为 W3C 协议以与驱动程序通信,然后将结果重新转换为旧版协议。由于代码必须为此进行一些假设和猜测才能工作,因此存在许多令人沮丧的边缘情况。

对于 Selenium 4.0,Ruby、JavaScript 和 .NET 绑定都删除了握手代码,因此不会使用任何旧版命令。由于在冻结 3.x 代码之前无法解决的一些问题,Python 将等到 Selenium 4.9 再删除其握手代码。Selenium 团队打算在整个 4.x 版本中继续支持 Grid 和 Java 绑定中的这两种协议,但是在 Selenium 4 Grid 上运行为 Selenium 2 编写的测试套件导致了比预期更大的故障数量。发现了六个错误,其中一些具有很大的影响。

有问题的代码非常复杂,以至于在不引起新问题的情况下修复这些错误将是一个巨大的挑战。因此,我们已决定通过明确不支持 Selenium 代码库中任何旧版协议中的功能和命令来再次开始简化代码库。如果您使用的是最新版本的 Java Selenium,则将删除的所有内容都已标记为已弃用,因此请仔细检查您的用法,以确保不会出现任何意外情况。

如果您对我们探索此问题时发现的一些具体细节感兴趣,可以查看 Selenium Issue #10374 中的讨论。

有关确保与 Grid 兼容性的更多信息,请遵循我们的 Selenium 4 升级指南

最后修改时间:2023 年 12 月 13 日: 更新协议支持博客中的版本 (a33a285b760)