监控并正常杀死或重用僵尸 GeckoDriver 实例



Selenium旨在在处理Web驱动程序实例时杀死Geckodriver进程,如下所示:driver.quit()。在我的测试框架中,我已配置为在每次测试后调用driver.quit()

但是,在某些情况下,由于各种原因,测试会异常终止,然后不会执行最终步骤(例如退出驱动程序)。结果,我最终得到了多个壁虎驱动程序进程,我只能手动杀死。

是否有任何好的做法可以解决此问题?也许以某种方式监视进程并杀死不传输任何数据的进程?

或者也许创建几个实例然后重用它们?

我正在 Grid 上运行我的测试,因此通过命令行操作进程将不起作用,因为它只会影响网格中心。

编辑

有一个选项可以使用taskkill来终止计算机上的所有壁虎驱动程序进程,但这不是一个好的解决方案,因为:

  1. 我正在通过Selenium Grid运行我的测试,所以这只会影响网格中心,而不会影响节点。
  2. 有多个测试同时运行,如果我使用taskkill我也会杀死仍在使用的测试。
  3. 我不认为使用taskkill杀死进程通常是一种很好的做法,我想找到一个更优雅的解决方案。 例如,(1)壁虎驱动程序进程在节点上受到监控,并且仅在不使用或(2)以某种方式重用时才在本地终止。

我将总结我在Selenium用户谷歌论坛上发布的对同一问题的回应

当 Driver.quit() 在网格模式下被调用时,会发生以下情况:

  • 客户端(运行测试方法的 JVM)向中心发送删除会话请求。
  • 集线器将删除会话请求转发到相应的节点。
  • 在节点上,selenium 独立 jar 将删除会话请求转换为对 DriverCommandExecutor.execute() 的调用,然后将其转发到 DriverService.stop()

DriverService.stop()内部触发对http://localhost:port/shutdown的调用(对于ChromeDriver是正确的,但对于Firefox,实现会检查启动geckodriver的端口的可用性)。

但是,在某些情况下,由于各种原因,测试会异常终止,然后不会执行最终步骤(例如退出驱动程序)。结果,我最终得到了多个壁虎驱动程序进程,我只能手动杀死。

为了解决这个问题,您可以在节点级别配置超时。

引用文档

-timeout, -sessionTimeout(以秒为单位):指定服务器自动终止尚未终止的会话之前的超时 在过去 X 秒内有任何活动。然后,测试槽将是 已发布以供另一个测试使用。这通常用于采取 处理客户端崩溃。对于网格中心/节点角色,清理循环必须 也设置。 默认值:1800

-browser超时(秒):在WebDriver命令运行时允许浏览器会话挂起的秒数 (例如:driver.get(url))。如果在 WebDriver 命令仍在处理中,会话将退出。 最小值为 60。未指定、零或负值表示
无限期等待。 默认值:0

看这里和这里

当您通过上述机制之一配置超时时,以及当节点检测到浏览器窗口由于以下原因而处于非活动状态时

  1. 由于客户端崩溃(您的测试用例是客户端)或
  2. 由于浏览器进入挂起状态(可能是由于流氓JavaScript)或
  3. 由于您的测试用例,打开浏览器窗口而不对其执行任何操作,

上述详细代码流将被触发,孤立浏览器和关联的服务器二进制文件都将被清理。如果它没有发生,那么它是一个错误,您需要提出一个问题并提供一个简单的独立测试,可以执行该测试来重现问题。

最新更新