当我的程序以任何方式终止时,有没有办法确保所有新的webdrivers实例都被终止(即在它们上调用某些相当于driver.quit())?也就是说,即使我忘记在代码中添加明确的.quit()
,或者程序崩溃/无法进入.quit()
调用,也要确保新进程将关闭。
编辑: 这是我想到的一个可能的解决方案,但我不确定它是否有效,不幸的是我现在无法自己测试它。我可以创建一个工厂类来创建驱动程序,并将这些驱动程序存储在静态列表中。然后添加一个关闭挂钩,在列表中的所有内容上调用quit。我不知道这是否有效,因为我之前从未使用过关机钩子:P
答案 0 :(得分:1)
首先显然不要忘记添加显式.quit()
。始终将phantomjs
驱动程序初始化包装到try...finally
运算符中,并在.quit()
块中执行final
。这应该保证phantomjs
的所有流程都将完成。
一般来说,虽然没有从JVM控制OS外部进程的一般方法,因为phantomjs
在内部启动新的OS进程。你可以做什么 - call from Java program OS-dependent command来查找和查杀phantomjs
进程。比方说,对于ubuntu
,它将是pkill -f phantomjs
:
(虽然没有经过测试)
java.lang.Runtime.getRuntime().exec("pkill -f phantomjs");
答案 1 :(得分:0)
您还可以考虑采用托管的浏览器实例化和清理方式,以便您的测试不必显式执行,但只使用为其创建的webdriver实例。
最简单的方法是:
通过这种方式,您的测试不必自行管理浏览器实例化和清理,您也不必采用特定于平台的方式来清理浏览器二进制文件。
This blogpost of mine,应该可以帮助您入门。