Это правильный способ использовать при закрытии в Geb

Сценарий: у меня есть страница входа, которая использует ajax для проверки пользователя, и если неверный вход, она остается на той же странице.

Мне интересно, правильно ли это использовать at в Geb, или я могу импровизировать. Обеспокоенность:

  1. Я использую waitFor с жестко заданным тайм-аутом и т.д.
  2. Должен ли waitFor находиться в блоке at?
  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()
        }
    }
}

person Aravind Yarram    schedule 22.03.2012    source источник


Ответы (1)


Обычно мы сохраняем at только для проверки, а затем делаем:

waitFor{ at LoginPage }

Но это может и не понадобиться, учитывая новую поддержку неявных утверждений в версии 0.7. http://www.gebish.org/manual/snapshot/implicit-assertions.html#at_verification

Я думаю, что вы действительно хотите здесь проверить наличие сообщения об ошибке и дождаться этого.

i.e,

 loginButton().click()

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

так как вы не можете заставить свое тогдашнее состояние потерпеть неудачу иначе.

Более того, вы, вероятно, могли бы поместить условие в состояние объекта вашей страницы, поэтому что-то вроде

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

и в вашем тесте становится легче читать.

waitFor{ isErrorState() } 
person Tomas Lin    schedule 23.03.2012
comment
+1 можно уточнить, что именно не нужно из-за поддержки неявных утверждений - person Aravind Yarram; 23.03.2012
comment
извините, я имел в виду, что обычно вы выполняете waitFor{ at LoginPage }, а затем проверяете на LoginPage. Но теперь с geb 0,7. вы можете просто выполнить waitFor{ at LoginPage } и не выполнять дополнительную проверку - person Tomas Lin; 24.03.2012