这是正确的使用方式" at"封闭在Geb

时间:2012-03-22 14:03:17

标签: java groovy spock geb

场景:我有一个使用ajax验证用户的登录页面,如果登录无效,它会保留在同一页面上。

我想知道这是否是在Geb中使用 的正确方法,或者我可以即兴发挥。顾虑:

  1. 我使用waitFor和硬编码超时等。
  2. 应该等待 阻止?
  3. 有没有更好的方法来写这个?
  4. Spec def

    def "perform invald login"()
    {
        given: "I am at the login page"
        to LoginPage
    
        when : "I entered invalid data"
        loginForm.loginClientCode = "test"
        loginForm.loginSystemCode = "test"
        loginForm.loginUserId = "test"
        loginForm.loginPassword = "test"
    
        loginButton().click()
    
        then: "Log in attempt unsuccessful"
        at(LoginPage)
    }
    

    页面对象

    class LoginPage extends Page
    {
        static url = "login/login.jsf";
    
        static at =
        {
            waitFor(10,0.5)
            {  $("div.ic-h1").text() == "User Authentication" }
        }
    
        static content =
        {
            loginForm
            {
                $("form",id: "loginForm")
            }
    
            loginButton
            {
                $("button", id: "loginButton")
            }
    
            statusMessages
            {
                $('div.ui-messages').text()
            }
        }
    }
    

1 个答案:

答案 0 :(得分:3)

我们通常只保留at以进行验证,然后执行:

waitFor{ at LoginPage }

但鉴于0.7中对隐式断言的新支持,可能不需要这样做。 http://www.gebish.org/manual/snapshot/implicit-assertions.html#at_verification

我认为你真正想要的是测试是否存在错误消息并等待。

即,

 loginButton().click()

 then: "Log in attempt unsuccessful"
 waitFor{ statusMessage == 'this login failed' }

因为你不能真正让你的条件失败。

此外,您可能会将条件置于页面对象的状态,如

def isErrorState() {
    statusMessage == 'this login failed'
}

在您的测试中,它变得更容易阅读。

waitFor{ isErrorState() }