Selenium旨在在处理Web驱动程序实例时杀死Geckodriver进程,如下所示:driver.quit()
。在我的测试框架中,我已配置为在每次测试后调用driver.quit()
。
但是,在某些情况下,由于各种原因,测试会异常终止,然后不会执行最终步骤(例如退出驱动程序)。结果,我最终得到了多个壁虎驱动程序进程,我只能手动杀死。
是否有任何好的做法可以解决此问题?也许以某种方式监视进程并杀死不传输任何数据的进程?
或者也许创建几个实例然后重用它们?
我正在 Grid 上运行我的测试,因此通过命令行操作进程将不起作用,因为它只会影响网格中心。
编辑:
有一个选项可以使用taskkill
来终止计算机上的所有壁虎驱动程序进程,但这不是一个好的解决方案,因为:
- 我正在通过Selenium Grid运行我的测试,所以这只会影响网格中心,而不会影响节点。
- 有多个测试同时运行,如果我使用
taskkill
我也会杀死仍在使用的测试。 - 我不认为使用
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
看这里和这里
当您通过上述机制之一配置超时时,以及当节点检测到浏览器窗口由于以下原因而处于非活动状态时
- 由于客户端崩溃(您的测试用例是客户端)或
- 由于浏览器进入挂起状态(可能是由于流氓JavaScript)或
- 由于您的测试用例,打开浏览器窗口而不对其执行任何操作,
上述详细代码流将被触发,孤立浏览器和关联的服务器二进制文件都将被清理。如果它没有发生,那么它是一个错误,您需要提出一个问题并提供一个简单的独立测试,可以执行该测试来重现问题。