1. 程式人生 > >selenium中的quit和close方法的區別

selenium中的quit和close方法的區別

我用selenium webdriver(以後簡稱SW) 驅動谷歌瀏覽器進行網頁資料的獲取。之所以用谷歌,主要是由於它是輕量級的,速度快。 做資料獲取,SW 是不錯的選擇。有人總是說,SW速度慢,比不上httpclient或者HtmlUnit,它們直接操作底層資料來的更加痛快。可是,不得不考慮的是,網路資料獲取是“你情我願”的事情。你本地的程式執行再快,伺服器那邊給你CUT!你照樣玩不轉。所以,只要計算機能力足夠強大,SW配合多執行緒,足以。 最近遇到一個惱火的問題,就是quit 和close,二者都是關閉瀏覽器。  ChromeDriver chrome = new ChromeDriver(); chrome.close(); chrome.quit(); 二者與什麼區別嗎?網上評論說,最好用quit而不用close. 因為quit 關閉的更加徹底。可是從各個方面的測看,我都看不出二者的區別。後來線上程池使用中,發現了quit的一個致命問題。 由於我是要獲取超大量的資料,所以,需要訪問海量網址。我計劃的是完成一個任務(用一個執行緒搞定),關閉瀏覽器,然後開闢另一個執行緒完成下一個任務。 結果出現了問題:
org.openqa.selenium.os.UnixProcess$SeleniumWatchDog destroyHarder
INFO: Command failed to close cleanly. Destroying forcefully (v2)
後來一個高手(估計是維護者)如是說:
that's an INFO logging line, not a warning. It's just saying that the process took too long to finish naturally and so is now being killed with the equivalent of "kill -9"。
這是啥意思?經過我仔細稽核自己的程式碼,我發現,問題處在了QUIT這個方法上。可是,當我對單獨測試的時候,結果這個問題又不見了。
因此,可以肯定。chrome.quit();實際上去試圖關閉所有的windows,雖然我只用了一個window,但是我之前訪問了太多的網頁,而沒有進行quit和重啟我的chrome.這讓我的chrome中殘留了太多的東西需要clean and close. 在最大允許的時間範圍內,quit無法結束chrome,所以只能kill. 
出現這個提示後,程式卡住了,不再繼續執行。
我不得不說,這是因為SW還不完善。但是,就目前看,多執行緒呼叫SW中關閉瀏覽器的最佳方式是使用close,這樣就不會出現上述問題。
我還發現,chrome的方法中沒有返回值為boolean的方法(除了equals之外),這一點很不利,因為我需要對chrome進行關閉,開啟,切換等。如果不能準別把握chrome的狀態,就可能出現很多異常陷阱。比如我想關閉,但是,如果這個chrome根本沒開著,就會出現異常。所以,如果能增加一個chrome.isOpen方法,或者chrome.getState方法,就很好了。