Selenium 2 中扩展测试的限制

在并行运行 Selenium2 时出现的额外约束总结。

此文档之前位于 wiki

并行运行 Selenium2

此页面尝试总结在并行运行 Selenium2 时出现的额外约束。

WebDriver 实例化

虽然单个 WebDriver 实例不能在线程之间共享,但很容易创建多个 WebDriver 实例。

临时套接字

TCP/IP v4 存在一个普遍问题,即 TCP/IP 堆栈在两个套接字之间建立连接时使用临时端口。这种情况的典型症状是,运行一段时间后(通常是一两分钟)开始出现连接失败。消息会有些不同,但总是在一段时间后出现,如果减少浏览器数量,最终会正常工作。

维基百科关于临时端口 或快速搜索 “临时套接字”” 将告诉您当前操作系统提供的端口以及如何设置它。

目前 (2.13.0) 看来,一个全速运行的 Firefox 每个 Firefox 会消耗大约 2000 个临时端口;您的具体情况可能会有所不同。这意味着您在 Windows XP 上运行 2 个浏览器就可能耗尽临时端口,如果您快速迭代,甚至 1 个浏览器也可能耗尽。

它会被修复吗?

临时套接字问题的解决方案是连接上的 HTTP1.1 keep alive。截至 2.13.0 版本,Firefox 不支持 keep-alive。

已修复的问题

  • Java 客户端。
  • Selenium 服务器 (“rc”)。
  • Selenium Grid 中心和节点
  • Ruby 绑定(请参阅 RubyBindings 中的说明)。
  • IE 驱动程序。
  • ChromeDriver

这意味着您可以使用 Java 客户端扩展到运行 Selenium 服务器的远程机器,而中央构建服务器上不会出现任何问题。不过,您可能需要在远程机器上解决套接字问题。

Microsoft Windows

如果您使用的是旧版本的 Windows (<=2003, 包括 XP),您不应该等待端口使用率降低到足以适应此空间。这可能永远不会发生,尽管某些组合可能会发生。有关如何调整端口范围,请参阅 http://support.microsoft.com/kb/196271

如果出于技术原因无法调整 Windows 机器上的端口范围,您将无法运行超过 2-3 个 Firefox 浏览器。

避免套接字锁

在每个测试类/测试方法之间启动新浏览器速度很慢,而且套接字锁也使用临时套接字,这加剧了上述问题。

如果您使用的是无套件测试设置(如许多 JUnit4 用户),您通常会在 @BeforeClass/@AfterClass 方法中启动/停止浏览器。另一种选择是在 @BeforeClass 中启动浏览器,并使用 JUnit/TestNG 运行监听器之类的东西在测试运行结束时关闭所有浏览器。Maven surefire 支持 JUnit 和 TestNG 的运行监听器。

(TODO:禁用套接字锁并自己管理端口的策略)

原生事件

由于原生事件逻辑中的一个共享文件,Firefox 驱动程序在并发运行时可能不应该使用原生事件。(关注此问题)。

上次修改时间:2022年1月12日:存档其他 wiki 文章 (e75f49c8af3)