监控并优雅地杀死或重用僵尸 GeckoDriver 实例

Posted

技术标签:

【中文标题】监控并优雅地杀死或重用僵尸 GeckoDriver 实例【英文标题】:Monitor and gracefully kill or reuse zombie GeckoDriver instances 【发布时间】:2018-06-25 21:51:42 【问题描述】:

Selenium 旨在在像这样处理 webdriver 实例时杀死 Geckodriver 进程:driver.quit()。在我的测试框架中,我已配置为在每次测试后调用driver.quit()

然而,在某些情况下,测试由于各种原因异常终止,然后没有执行最终步骤(如退出驱动程序)。结果,我最终得到了多个只能手动终止的 geckodriver 进程。

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

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

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

编辑

可以选择使用taskkill 来终止机器上的所有 geckodriver 进程,但这不是一个好的解决方案,因为:

    我正在通过 Selenium Grid 运行我的测试,因此这只会影响网格集线器而不影响节点。 有多个测试同时运行,如果我使用taskkill,我也会杀死仍在使用的测试。 我不认为使用taskkill 终止进程通常是一个好习惯,我想找到一个更优雅的解决方案。例如。 (1)geckodriver 进程在节点上受到监控,只有在不使用或 (2) 以某种方式重用时才在本地终止。

【问题讨论】:

Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?的可能重复 @DebanjanB 是的,我已经看到了问题和答案,这与我的情况无关。首先,我不认为使用taskkill 杀死进程是一个好习惯,因为我通过网格运行测试,这只会影响网格集线器而不影响节点。其次,我想找到一个更优雅的解决方案,在节点上监视 geckodriver 进程,并且仅在它们不使用时在本地终止。正如我所提到的,另一种选择是以某种方式重用这些流程。我也将此添加到我的问题中。 【参考方案1】:

我将总结一下我在Selenium-Users google forum上发布的相同问题的回复

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

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

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

然而,在某些情况下,测试由于各种原因异常终止,然后没有执行最终步骤(如退出驱动程序)。结果,我最终得到了多个只能手动终止的 geckodriver 进程。

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

引用文档

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

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

见here和here

当您通过上述机制之一配置超时时,以及当节点检测到由于

而导致浏览器窗口处于非活动状态时
    由于客户端崩溃(您的测试用例是客户端)或 由于浏览器进入挂起状态(可能是由于恶意 javascript)或 由于您的测试用例,打开一个浏览器窗口并没有对其执行任何操作,

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

【讨论】:

非常感谢您的详细回答和见解!非常感谢。

以上是关于监控并优雅地杀死或重用僵尸 GeckoDriver 实例的主要内容,如果未能解决你的问题,请参考以下文章

Linux系列:查看并杀死僵尸进程,自动告警方法

Linux系列:查看并杀死僵尸进程,自动告警方法

如何使用子进程模块杀死(或避免)僵尸进程

【zombie】如何查看并杀死僵尸进程?

Linux上寻找并杀死僵尸进程

优雅地停止 ecs 容器