Geb UI 自動化手冊(3: WebDriver 實現)

3. WebDriver 實現

        Browser 實例在底層是通過一個 WebDriver 實例來與瀏覽器完成交互的。可以使用 Browser 實例的 getDriver() 方法來獲取底層使用的 WebDriver 實例。

        注:WebDriver 推崇的一個關鍵設計原則是:測試和腳本應該基於 WebDriver API 來編寫,這樣他們對底層驅動的具體瀏覽器就沒有感知,從而使他們具有可移植性。Geb 也一向支持這個目標。但實際上,在不同的瀏覽器驅動實現之間仍然存在着不少行爲差異。WebDriver 的每一個發佈都在試圖減小這些差異性,我們期待隨着 WebDriver 越來越成熟,這種情況也得到改善。

 

3.1 顯式驅動(driver)管理

        指定瀏覽器驅動具體實現的一種方式是直接創建一個所需實現的 WebDriver 實例,讓後把它傳給待創建的 Browser 對象。然而,如果可能的話,還是推薦使用本章將介紹的隱式的瀏覽器驅動管理機制。

顯式生命期

        當瀏覽器驅動由用戶創建時,用戶就需要負責在適當的時機來退出瀏覽器。這可以通過在 WebDriver 實例(通過 Browser 實例的 getDriver() 方法獲取)上調用相應的方法,或在 Browser 實例上調用對應的委派方法來實現。

 

3.2 隱式驅動管理

        如果在創建 Browser 對象時,沒有指定 driver 屬性,Geb 就會使用配置機制來隱式的創建一個受管理的瀏覽器驅動對象。

隱式生命期

        默認情況下,Geb 內部會緩存和重用第一個創造的瀏覽器驅動,這意味着所有後續創建的 Browser 實例,如果沒有爲其顯式的指定 driver,他們都會重用這個被緩存的瀏覽器驅動。這避免了每次創建一個新驅動的開銷,這種開銷在使用真實的瀏覽器時還是相當大的。這樣意味着你可能需要調用 Browser 實例的 clearCookies()clearCookies(String... additionalUrls)clearWebStorage() 方法,來避免之前執行產生的狀態對本次執行造成奇怪的影響。

注:一些 Geb 的集成項目(如:Spock, JUnit)會在適當的時間點(如每個測試執行完成後)自動清除當前域的瀏覽器 cookies 和 web 存儲。 查看後續測試章節中關於 cookie 管理和 web 存儲管理的部分來獲取更多信息。

在 JVM 關閉時,共享的瀏覽器驅動也會被關閉並退出。

如果需要產生一個新的瀏覽器驅動實例的話,可以在任何時刻調用 CachingDriverFactory.clearCache()CachingDriverFactory.clearCacheAndQuitDriver() 這兩個靜態方法中之一來實現。調用這其中的任一個方法後,下一次請求默認的瀏覽器驅動時將會創建一個新的實例。

緩存瀏覽器驅動的行爲是可配置的。

 

3.3 不同瀏覽器驅動的獨特行爲

        本節主要介紹各種不同瀏覽器驅動實現自身的一些奇怪行爲或問題。

HTMLUintDriver

處理使用 HTML 刷新的頁面

默認情況下,當 HTMLUnit 瀏覽器驅動在遇到 <meta http-equiv="refresh" content="5"> 元標籤時,它將立即刷新頁面,並不會理會標籤中指定時間。這個問題的解決方法是使用一個刷新處理器(handler)來異步的處理刷新。

import com.gargoylesoftware.htmlunit.ThreadedRefreshHandler

Browser.drive {
    driver.webClient.refreshHandler = new ThreadedRefreshHandler()    //1
    
}

//1: 從現在開始,刷新元標籤中的值將會被遵守

可以查閱這個郵件列表來了解更多細節。

 

日誌配置

HTMLUnit 日誌輸出非常吵雜,目前並不清楚如何使它不這麼吵雜。

查看這個問題來獲取一些日誌調優的建議。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章