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