1

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

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

  1. 我正在使用带有硬编码超时等的waitFor。
  2. waitFor 应该块中吗?
  3. 有没有更好的方法来写这个?

规格定义

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()
        }
    }
}
4

1 回答 1

3

我们通常保留 at 仅用于验证目的,然后执行以下操作:

waitFor{ at LoginPage }

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

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

IE,

 loginButton().click()

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

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

此外,您可以将条件放入页面对象的状态中,例如

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

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

waitFor{ isErrorState() } 
于 2012-03-23T08:20:28.453 回答