监控并优雅地杀死或重用僵尸 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 实例的主要内容,如果未能解决你的问题,请参考以下文章