Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保程序终止时退出程序生成的所有Selenium WebDriver?_Java_Selenium_Selenium Webdriver_Phantomjs - Fatal编程技术网

Java 如何确保程序终止时退出程序生成的所有Selenium WebDriver?

Java 如何确保程序终止时退出程序生成的所有Selenium WebDriver?,java,selenium,selenium-webdriver,phantomjs,Java,Selenium,Selenium Webdriver,Phantomjs,当我的程序以任何方式终止时,是否有任何方法可以确保WebDriver的所有新实例都被终止(即,对它们调用了一些等效的driver.quit()?也就是说,即使我忘记在代码中添加显式的.quit(),或者程序崩溃/无法进行.quit()调用,也要确保新进程将关闭 编辑: 这是我想到的一个可能的解决方案,但我不确定它是否有效,不幸的是,我现在不能自己测试它。我可以创建一个工厂类来创建驱动程序,还可以将这些驱动程序存储在一个静态列表中。然后添加一个shutdownhook,对列表中的所有内容调用qui

当我的程序以任何方式终止时,是否有任何方法可以确保WebDriver的所有新实例都被终止(即,对它们调用了一些等效的driver.quit()?也就是说,即使我忘记在代码中添加显式的
.quit()
,或者程序崩溃/无法进行
.quit()
调用,也要确保新进程将关闭

编辑:
这是我想到的一个可能的解决方案,但我不确定它是否有效,不幸的是,我现在不能自己测试它。我可以创建一个工厂类来创建驱动程序,还可以将这些驱动程序存储在一个静态列表中。然后添加一个shutdownhook,对列表中的所有内容调用quit。我不知道这是否有效,因为我以前从未使用过关机挂钩:P

首先,显然不要忘记添加显式的

.quit()
。始终将
phantomjs
驱动程序初始化包装到
try…finally
操作符中,并在
final
块中执行
.quit()
。这将保证所有的
phantomjs
过程都将完成

一般来说,虽然没有从JVM控制操作系统外部进程的通用方法,但是
phantomjs
在内部启动新的操作系统进程。您可以做什么-查找和杀死
phantomjs
进程。比如说,对于
ubuntu
,它将是
pkill-f phantomjs

(类似于,但未经测试)


您还可以考虑采用浏览器实例化和清理的托管方式,这样您的测试就不必显式地执行,而只使用为其创建的webdriver实例

最简单的方法是:

  • 首先通过创建自定义注释来定义意图(即,测试需要web浏览器)
  • 利用TestNG监听器(您提到Java,所以我猜您可能会考虑使用TestNG或JUnit之类的测试运行程序),在其中截取测试方法,检查它们是否有自定义注释,如果有,则实例化webdriver实例并推送到线程本地变体中,您的测试将只是查询。在测试方法运行完成后,您将在后调用中清理实例化的webdriver
这样,您的测试就不必自己管理浏览器实例化和清理,也不必求助于特定于平台的清理浏览器二进制文件的方法


,应该可以帮助你开始。

哈哈,是的,我会尽我所能不健忘。添加额外的系统调用以终止进程可能会很好。谢谢
java.lang.Runtime.getRuntime().exec("pkill -f phantomjs");