gpt4 book ai didi

java - 监视并优雅地杀死或重用僵尸 GeckoDriver 实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:48:19 26 4
gpt4 key购买 nike

Selenium 设计为在处理 webdriver 实例时终止 Geckodriver 进程,如下所示:driver.quit()。在我的测试框架中,我已配置为在每次测试后调用 driver.quit()

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

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

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

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

编辑:

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

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

最佳答案

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

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

  • 客户端(运行您的测试方法的 JVM)向集线器发送删除 session 请求。
  • hub将删除 session 请求转发给相应的节点。
  • 在节点上,selenium 独立 jar 将删除 session 请求转换为对 DriverCommandExecutor.execute() 的调用然后转发到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

参见 herehere

当您通过上述机制之一配置超时时,以及当节点检测到浏览器窗口因

而处于非 Activity 状态时
  1. 由于客户端崩溃(您的测试用例是客户端)或
  2. 由于浏览器进入挂起状态(可能是由于恶意 javascript)或
  3. 由于您的测试用例,打开浏览器窗口但未对其执行任何操作,

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

关于java - 监视并优雅地杀死或重用僵尸 GeckoDriver 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48293940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com