Java 这是正确的使用方法吗;at";Geb中的关闭

Java 这是正确的使用方法吗;at";Geb中的关闭,java,groovy,spock,geb,Java,Groovy,Spock,Geb,场景:我有一个使用ajax验证用户的登录页面,如果登录无效,它将保持在同一页面上 我想知道这是否是在Geb中使用at的正确方法,或者我可以在这方面即兴创作。关注事项: 我正在使用带有硬编码超时等的waitFor waitFor是否应位于at块中 有没有更好的写作方法 规格定义 def "perform invald login"() { given: "I am at the login page" to LoginPage when : "I entered inva

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

我想知道这是否是在Geb中使用at的正确方法,或者我可以在这方面即兴创作。关注事项:

  • 我正在使用带有硬编码超时等的waitFor
  • waitFor是否应位于at块中
  • 有没有更好的写作方法
  • 规格定义

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

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

    waitFor{ at LoginPage }
    
    但考虑到0.7中对隐式断言的新支持,可能不需要这样做

    我认为您真正想要的是测试是否存在错误消息,然后等待

    i、 e

    因为你不可能真的让你的条件失败,否则

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

    def isErrorState() {
        statusMessage == 'this login failed'
    }
    
    在你的测试中,它变得更容易阅读

    waitFor{ isErrorState() } 
    

    +1由于隐式断言的支持,您能详细说明什么是不需要的吗对不起,我的意思是您通常会执行waitFor{at LoginPage},然后测试at LoginPage。但现在是geb 0.7。您只需等待{at LoginPage},而不需要进行额外的检查
    waitFor{ isErrorState() }