Щелчок Geb выполняется до завершения ввода

Я запускаю простой тест Geb, например:

class IndexPage extends Page {
  //static url = "http://localhost:8080/sampleGrailsApp"
  static at = { title == "sampleGrailsApp" }
  static content = {
    signInButton { $("div", 0, class: "container-fluid").find("button", 0) }
    modalFooterSignInButton(wait: true, to: MyPage) { $("footer", 0, class: "modal-footer").find("input", 0, class: "btn-primary") }
    modalFooterUsernameInput { $("form").username = it }
    modalFooterPasswordInput { $("form").password = it }
    signIn { username, password ->
      signInButton.click()
      waitFor { modalFooterSignInButton.present }
      modalFooterUsernameInput username
      modalFooterPasswordInput password
      modalFooterSignInButton.click()
    }
  }    
}

В моем тесте страница называется следующим образом:

def "sigin"() {
    given: "User is at index page"
    at IndexPage

    when: "User signs in"
    signIn "username","password"

    then: "Goes to MyPage"
    at MyPage
  }

В некоторых случаях modalFooterSignInButton.click() происходит до того, как имя пользователя введено полностью, поэтому тест не проходит. Кто-нибудь сталкивался с этим раньше? Как дождаться завершения ввода, прежде чем активируется щелчок? Я использую Геб 0.9.2.

Заранее спасибо.


person user3240644    schedule 24.04.2014    source источник


Ответы (2)


Попробуйте использовать isDisplayed() вместо Present, так как Present означает, что он присутствует в коде, но isDisplayed() означает, что он отображается в пользовательском интерфейсе. Надеемся, что следующие материалы решат вашу проблему!

waitFor { modalFooterSignInButton.isDisplayed()}

Кроме того, используйте waitFor{} в случае критических ситуаций, так как я ничего не знаю о вашем приложении.

person Sharif Mamun    schedule 24.04.2014
comment
Спасибо. isDisplayed(), похоже, решил проблему. На данный момент я не могу быть уверен, потому что проблема была прерывистой. Но я запускал тест несколько раз и не сталкивался с проблемой. Еще раз спасибо. - person user3240644; 24.04.2014
comment
@ user3240644: Не беспокойся, чувак! Чувство действительно потрясающее, что это сработало для вас! Давайте растить сообщество geb и делать его больше! - person Sharif Mamun; 24.04.2014

Вы можете сделать что-то вроде:

waitFor { $(<username-input>).text().contains("username") } // after username is entered.
waitFor { $(<password-input>).text().contains("password") } // after password is entered.

перед вызовом modalFooterSignInButton.click()

Кроме того, это поведение характерно для любого браузера или оно происходит во всех браузерах?

person Lalit Agarwal    schedule 24.04.2014
comment
Спасибо, я пробовал, но это не работает. Я не думаю, что можно прочитать ввод текста, поскольку он не отображается в html. В настоящее время я тестирую его только в Chrome, поэтому я не уверен, что это происходит в других браузерах. - person user3240644; 24.04.2014
comment
Не идеальное решение, но если вы добавите сон (500) или сон (1000) перед modalFooterSignInButton.click(), тогда он должен работать. - person Lalit Agarwal; 24.04.2014
comment
Я никогда не видел, чтобы кому-то приходилось ждать завершения ввода текста, поэтому такое поведение сбивает меня с толку. :( - person user3240644; 24.04.2014
comment
waitFor должен быть достаточно хорош, чтобы справиться с такими ситуациями! Даже Эрди или Питер, которые являются основными разработчиками geb, всегда отговаривают использовать сон или связанные с ним вещи! Я сам никогда не использовал сон в гэбе! - person Sharif Mamun; 24.04.2014
comment
@user3240644 user3240644 Даже я не сталкивался с таким поведением, но всегда использовал FireFox для тестирования. Мамун: Согласна с вами, но всегда есть исключения :) - person Lalit Agarwal; 24.04.2014
comment
@LalitAgarwal: правда, но не конкретно со сном в геб. Я могу вспомнить одно исключение, которое работало с конкретными условиями браузера. В любом случае спасибо. - person Sharif Mamun; 24.04.2014
comment
@ S.M.AlMamun Поправьте меня, если я ошибаюсь, но waitFor не сработает в этом случае, поскольку Геб не может прочитать то, что было введено в поле ввода, верно? - person user3240644; 24.04.2014
comment
Это должно вызвать исключение. Можете ли вы попробовать isDisplayed(), как я предложил в своем ответе? - person Sharif Mamun; 24.04.2014
comment
@user3240644 user3240644 Также можете ли вы проверить, доступно ли какое-либо обновление для используемого вами драйвера Chrome? Поскольку Chrome продолжает обновляться в фоновом режиме, иногда эти проблемы решаются путем обновления драйвера. Если возможно, попробуйте это и с Firefox. - person Lalit Agarwal; 24.04.2014
comment
Лалит, спасибо за помощь. Ответ @SMAlMamun, похоже, решил проблему. - person user3240644; 24.04.2014
comment
@ user3240644: Почему бы вам не принять и не проголосовать за ответ, чтобы другие не задавали тот же/похожий вопрос в будущем? Ваше здоровье! - person Sharif Mamun; 24.04.2014