2017-02-12 66 views
1

当我的程序以任何方式终止时,有什么方法可以确保所有webdrivers的新实例都被终止(即对它们调用一些等效的driver.quit())?也就是说,即使我忘记在代码中添加明确的.quit(),或者程序崩溃/否则无法到达.quit()调用,以确保新过程将关闭。如何确保我的程序产生的所有Selenium Web驱动程序在程序终止时退出()?

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

回答

1

首先显然不要忘记添加明确的.quit()。始终将phantomjs驱动程序初始化包装为try...finally运算符,并在final块中执行.quit()。这应该保证所有进程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"); 
+0

哈哈是啊我会尽我所能不要忘记。添加一个额外的系统调用来杀死进程可能会正常工作。谢谢! – misaka

0

你也可以认为诉诸浏览器实例和清理的管理方式,让您的测试穿上”不必明确地做,但他们只使用为他们创建的webdriver实例。

这样做的最简单的方法是:

  • 你首先创建一个自定义的注释定义的意图(即测试想要一个网页浏览器),
  • 杠杆率TestNG的监听器(你做提到Java,所以我猜测你会考虑使用一些Test Run或者JUnit等Test Runner的风格),其中你拦截测试方法,检查他们是否有你的自定义注释,如果他们这样做,你实例化一个webdriver实例并推入线程本地变体,你的测试只是查询。在测试方法运行完成后,您将在调用后清理实例化的web驱动程序。

这样你的测试就不必管理浏览器实例化和自己清理了,你也不必诉诸平台特定的清理浏览器二进制文件的方式。

This blogpost of mine,应该可以帮助你开始。

相关问题