监视并优雅地杀死或重用僵尸 GeckoDriver 实例
Monitor and gracefully kill or reuse zombie GeckoDriver instances
Selenium 旨在像这样处理 webdriver 实例时终止 Geckodriver 进程:driver.quit()
。在我的测试框架中,我已配置为在每次测试后调用 driver.quit()
。
然而,在某些情况下,测试由于各种原因异常终止,然后没有执行最终步骤(如退出驱动程序)。结果,我得到了多个只能手动终止的 geckodriver 进程。
有什么好的做法可以解决这个问题吗?也许以某种方式监视进程并杀死那些不传输任何数据的进程?
或者创建几个实例然后重新使用它们?
我运行正在网格上进行测试,因此通过命令行操作过程将不起作用,因为它只会影响网格中心。
编辑:
可以选择使用 taskkill
终止机器上的所有 geckodriver 进程,但这不是一个好的解决方案,因为:
- 我运行通过 Selenium Grid 进行测试,因此这只会影响网格中心而不影响节点。
- 有多个测试 运行 同时进行,如果我使用
taskkill
我也会杀死仍在使用的测试。
- 我认为使用
taskkill
终止进程通常不是一个好的做法,我想找到一个更优雅的解决方案。例如。 (1)geckodriver 进程在节点上受到监视,并且仅在不使用或 (2)以某种方式重用时在本地终止。
我将总结我在 Selenium-Users google forum
上发布的对同一问题的回复
在网格模式下调用 Driver.quit() 时,会发生以下情况:
- 客户端(运行测试方法的 JVM)向集线器发送删除会话请求。
- 集线器将删除会话请求转发给相应的节点。
- 在节点上,selenium 独立 jar 将删除会话请求转换为对 DriverCommandExecutor.execute() which then gets forwarded to DriverService.stop()
的调用
DriverService.stop()
在内部触发对 http://localhost:port/shutdown
的调用(对于 ChromeDriver 是正确的,但对于 Firefox,该实现检查启动 geckodriver 的端口的可用性)。
In some cases however, the test terminates abnormally due to various reason and then the finalizing steps (like quitting the driver) are not being executed. As a result I end up with multiple geckodriver processes that I can only kill manually.
为了解决这个问题,您可以在节点级别配置超时。
引用文档
-timeout, -sessionTimeout in seconds : Specifies the timeout before the server automatically kills a session that hasn't
had any activity in the last X seconds. The test slot will then be
released for another test to use. This is typically used to take
care of client crashes. For grid hub/node roles, cleanUpCycle must
also be set. Default: 1800
-browserTimeout in seconds : number of seconds a browser session is allowed to hang while a WebDriver command is running
(example: driver.get(url)). If the timeout is reached while a
WebDriver command is still processing, the session will quit.
Minimum value is 60. An unspecified, zero, or negative value means
wait indefinitely. Default: 0
当您通过上述机制之一配置超时时,以及当节点检测到浏览器 window 由于
不活动时
- 由于客户端崩溃(您的测试用例是客户端)或
- 由于浏览器进入挂起状态(可能是由于流氓 javascript)或
- 由于您的测试用例,打开浏览器 window 但不执行任何操作,
上面详细的代码流将被触发,孤儿浏览器和相关的服务器二进制文件都将被清理。如果它没有发生那么它是一个错误,你需要提出一个问题并提供一个简单的独立测试,可以执行它来重现问题。
Selenium 旨在像这样处理 webdriver 实例时终止 Geckodriver 进程:driver.quit()
。在我的测试框架中,我已配置为在每次测试后调用 driver.quit()
。
然而,在某些情况下,测试由于各种原因异常终止,然后没有执行最终步骤(如退出驱动程序)。结果,我得到了多个只能手动终止的 geckodriver 进程。
有什么好的做法可以解决这个问题吗?也许以某种方式监视进程并杀死那些不传输任何数据的进程?
或者创建几个实例然后重新使用它们?
我运行正在网格上进行测试,因此通过命令行操作过程将不起作用,因为它只会影响网格中心。
编辑:
可以选择使用 taskkill
终止机器上的所有 geckodriver 进程,但这不是一个好的解决方案,因为:
- 我运行通过 Selenium Grid 进行测试,因此这只会影响网格中心而不影响节点。
- 有多个测试 运行 同时进行,如果我使用
taskkill
我也会杀死仍在使用的测试。 - 我认为使用
taskkill
终止进程通常不是一个好的做法,我想找到一个更优雅的解决方案。例如。 (1)geckodriver 进程在节点上受到监视,并且仅在不使用或 (2)以某种方式重用时在本地终止。
我将总结我在 Selenium-Users google forum
上发布的对同一问题的回复在网格模式下调用 Driver.quit() 时,会发生以下情况:
- 客户端(运行测试方法的 JVM)向集线器发送删除会话请求。
- 集线器将删除会话请求转发给相应的节点。
- 在节点上,selenium 独立 jar 将删除会话请求转换为对 DriverCommandExecutor.execute() which then gets forwarded to DriverService.stop() 的调用
DriverService.stop()
在内部触发对 http://localhost:port/shutdown
的调用(对于 ChromeDriver 是正确的,但对于 Firefox,该实现检查启动 geckodriver 的端口的可用性)。
In some cases however, the test terminates abnormally due to various reason and then the finalizing steps (like quitting the driver) are not being executed. As a result I end up with multiple geckodriver processes that I can only kill manually.
为了解决这个问题,您可以在节点级别配置超时。
引用文档
-timeout, -sessionTimeout in seconds : Specifies the timeout before the server automatically kills a session that hasn't had any activity in the last X seconds. The test slot will then be released for another test to use. This is typically used to take care of client crashes. For grid hub/node roles, cleanUpCycle must also be set. Default: 1800
-browserTimeout in seconds : number of seconds a browser session is allowed to hang while a WebDriver command is running (example: driver.get(url)). If the timeout is reached while a WebDriver command is still processing, the session will quit. Minimum value is 60. An unspecified, zero, or negative value means
wait indefinitely. Default: 0
当您通过上述机制之一配置超时时,以及当节点检测到浏览器 window 由于
不活动时- 由于客户端崩溃(您的测试用例是客户端)或
- 由于浏览器进入挂起状态(可能是由于流氓 javascript)或
- 由于您的测试用例,打开浏览器 window 但不执行任何操作,
上面详细的代码流将被触发,孤儿浏览器和相关的服务器二进制文件都将被清理。如果它没有发生那么它是一个错误,你需要提出一个问题并提供一个简单的独立测试,可以执行它来重现问题。