如何确保我的程序生成的所有Selenium web驱动程序在程序终止时退出(?)

时间:2017-02-12 02:54:56

标签: java selenium selenium-webdriver phantomjs

当我的程序以任何方式终止时,有没有办法确保所有新的webdrivers实例都被终止(即在它们上调用某些相当于driver.quit())?也就是说,即使我忘记在代码中添加明确的.quit(),或者程序崩溃/无法进入.quit()调用,也要确保新进程将关闭。

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

2 个答案:

答案 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实例。

最简单的方法是:

  • 首先通过创建自定义注释来定义意图(即测试需要Web浏览器),
  • 利用TestNG监听器(你确实提到了Java,所以我猜你会考虑使用一些测试运行器,如TestNG或JUnit),其中你拦截测试方法,检查他们是否有你的自定义注释,如果他们这样做,你实例化一个webdriver实例并推入一个线程本地变体,你的测试只会查询。在测试方法运行完成后,您将在调用之后清理实例化的webdriver。

通过这种方式,您的测试不必自行管理浏览器实例化和清理,您也不必采用特定于平台的方式来清理浏览器二进制文件。

This blogpost of mine,应该可以帮助您入门。