Как добавить условие ожидания в сценариях капибары? - PullRequest
6 голосов
/ 17 ноября 2011

Я использую капибару для тестирования моего приложения rails для интеграционного тестирования.В моем приложении есть много вызовов Lightbox, Ajax и js.

 @javascript   
  Scenario: I agree functionatilty
   Given I go to the create account page
   When I click on button which is given as image "lnkTerms2"
   And I follow "i_agree"
   Then I go to the create account page

Здесь выше код lnkTerms2 - это и id, который поможет при вызове функции js открыть лайтбокс.И я получаю сообщение об ошибке как

   Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError)
      [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:256:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:305:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:320:in `unknown'
      [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:197:in `unknown'
      (eval):2:in `send'
      (eval):2:in `click_link'
      ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/'
      features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"'

Проблема заключается в том, что эта функция вызывается в веб-драйвере, она не получает времени для загрузки вызовов javascript и ajax.И лайтбокс не открывается.Поэтому, пожалуйста, предложите мне какое-нибудь решение.

Также, если предположить, что я напишу строку

When I click on button which is given as image "lnkTerms2"

после 4-5 операторов, тогда он работает нормально, так как у него есть время для загрузки js.

Ответы [ 3 ]

12 голосов
/ 16 февраля 2013

Как правило, фиксированные сны / ожидания - это плохо. Это грубый метод, который приводит к хрупким сценариям, медленным сценариям или часто к обоим. Если вы не установите их достаточно долго, то иногда тесты прерываются, если вы устанавливаете их слишком долго, то тесты никогда не прерываются, но они МЕДЛЕННЫЕ из-за всего фиксированного времени переключения большого пальца.

Большинство инструментов автоматизации либо автоматизируют ожидание, либо предоставляют более изящные способы синхронизации ваших сценариев с вашим приложением

Недавняя публикация в блоге JNicklas объясняет некоторые недавние изменения в Capybara в этом отношении, предоставляет некоторые примеры некоторых способов сделать определенный тип кода ожидания для условий для некоторых особых случаев, и в General рекомендует больше узнать об инструменте и о том, как он работает с ожиданием материала, действиями ajax и синхронизацией.

3 голосов
/ 22 ноября 2011

Для паузы после шага в ожидании ajax попробуйте:

And I wait 5 seconds

Вы должны добавить в web_steps.rb следующий код:

When /^I wait (\d+) seconds?$/ do |seconds|
  sleep seconds.to_i
end
1 голос
/ 28 декабря 2012

Ожидание фиксированного количества секунд в надежде, что ваш сценарий будет достаточно быстрым, - не лучшая стратегия, поскольку она может привести к случайным сбоям тестов. Я рекомендую вам подождать, пока не будет выполнено какое-либо условие:

And I wait until '#meow' is visible

#...
When /^I wait until '([^']+)' is visible$/ do |selector|
  wait_until do # you can also specify timeout here
    find(selector).visible?
  end
end
...