2017-02-12 26 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,應該可以幫助你開始。

相關問題