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 日志输出非常吵杂,目前并不清楚如何使它不这么吵杂。

查看这个问题来获取一些日志调优的建议。

 

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