【问题标题】:Geb & Spock: Close Browser Between Each TestGeb & Spock:在每次测试之间关闭浏览器
【发布时间】:2014-05-28 16:33:42
【问题描述】:

我需要在每次测试之间关闭浏览器。 Geb 为我创建了浏览器,所以我认为 Geb 应该在每次测试之间关闭驱动程序。然而事实并非如此。这是 GebConfig.groovy 的结构和一部分。

test_automation
-functional
--src
---test
---groovy
----spec
-----Test Locations
---resources
----GebConfig.groovy

GebConfig.groovy

waiting {
    timeout = 20
}

environments {
    chrome {
        driver = {
            System.setProperty('webdriver.chrome.driver', 'src/test/resources/chromedriver')
            new ChromeDriver()
        }
    }

    firefox {
        driver = { new FirefoxDriver() }
    }
}

我已将 GebSpec 扩展到 CommonGebSpec,以下是我尝试过的多种方法:

CommonGebSpec.groovy

def setup() {
    resetBrowser()
    getBrowser()
}

def cleanup() {
    browser.close()
    browser.quit()
}
______________________________

def cleanup() {
    browser.clearCookies()
}
______________________________

def cleanup() {
    resetBrowser()
}

我已经专门尝试过这些,并且可能会有所变化。有人知道为什么我的浏览器在测试之间不会关闭吗?

谢谢。

【问题讨论】:

  • Geb 在每个任务后退出。每次测试后不知道能不能退出!
  • 请问每次测试后想重启浏览器的原因是什么?您想在特定规范中的每次测试后重新启动它还是在全球范围内进行每次测试?
  • 全球每个测试。应用程序的工作方式是,如果我们遇到某种错误,则会出现一个没有注销的 404 页面。因此,用户的凭据仍然被缓存,如果我们开始运行新任务,我们会有一些冲突。为了确保我们以干净的状态开始,而不是解决这个混乱,重新启动浏览器更容易。

标签: spock geb


【解决方案1】:

这是一个在 Geb 用户列表中包含 its associated thread 的示例。回答您的问题可能有点矫枉过正,但它显示了如何退出并为每个测试启动一个新的浏览器实例。

请注意,您必须在每次测试后自行退出()浏览器。

import geb.spock.GebSpec
import pages.RememberMePage
import spock.lang.*
import utils.PageHelper
import org.openqa.selenium.Cookie

class RememberMeLoginSpec extends GebSpec {
    @Shared cookieName = "remember-me"
    @Shared cookieValue = "initial"

    def "login user with remember me checked and close browser"() {
        given: 
        PageHelper.login(browser, "userOne", "password1!", true, false)
        cookieValue = driver.manage().getCookieNamed(cookieName).getValue()
        browser.close()
    }

    def "user opens browser"() {
        when: "cookie is set and user is logged in"
        browser.config.cacheDriver = false
        browser.driver = browser.config.driver
        RememberMePage rememberMePage = browser.to RememberMePage
        // navigate to a page before setting cookie to avoid 
        // https://code.google.com/p/chromedriver/issues/detail?id=728
        go "pageOne"
        Cookie cookie = new Cookie(cookieName, cookieValue)
        driver.manage().addCookie(cookie)
        // navigate to new page to "login" user
        go "pageTwo"

        then: "username appears in greeting and page requiring full authentication shows login modal"
        rememberMePage.navigation.greetingText.text().endsWith("userOne")
        rememberMePage.loginModal.loginModal.present

        cleanup:
        browser.quit()
   }
}

【讨论】:

  • 谢谢,我在尝试调用 getBrowser() 时错误地重启了浏览器 为了简化它: def setup() { browser.config.cacheDriver = false browser.driver = browser.config.driver } def cleanup() { browser.quit() }
  • 没错。现在我重新阅读了您的问题,我看到它说“每个测试”。当我回答时,我的时区已经很晚了。很高兴它有帮助。
  • 使用browser.close() 代替browser.quit()。关闭浏览器后仍然会上报,否则会抛出异常。
  • 此解决方案具有丑陋的副作用,即关闭第一个浏览器后会话无效。随后,不再截取更多屏幕截图。也没有考虑到不能依赖词法执行顺序来特征方法的事实。也许您想查看my better solution here。 P.S.:它不考虑 cookie 处理,而是浏览器/驱动程序处理。
【解决方案2】:

如果您在每个类/文件中进行单个测试,请尝试以下代码:

 def cleanupSpec() {
    if(browser.driver){
        CachingDriverFactory.clearCache()
        browser.driver.quit()
    }
}

通常如果你使用 cleanup() 方法,它会在第一个实例后关闭浏览器,随后的测试将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多