#ruby-on-rails #selenium #cucumber #colorbox
#ruby-on-rails #selenium #cucumber #colorbox
Вопрос:
Я использую библиотеку colorbox для отображения лайтбоксов в моем приложении (http://colorpowered.com/colorbox /). Код, похоже, отлично работает в браузере, но у меня возникли проблемы с запуском автоматического теста.
Вот некоторый встроенный HTML, который генерируется:
<div class='hidden'>
<div id='override'>
Are you sure you want to override this action?
<br>
<a href="" class="close_colorbox">Cancel</a></li>
<a href="#" onclick="override(this); return false;">Override once</a>
</div>
</div>
Это javascript, который открывает colorbox:
$.fn.colorbox({innerWidth:600, inline:true, href:'#override', scrolling:false});
Этот код открывает лайтбокс и отображает содержимое моего div ‘#override’. В моих тестах cucumber я могу найти текст внутри этого div, но я получаю сообщение об ошибке, если я пытаюсь перейти по ссылке:
When I follow "link that generates override"
Then I should see "Are you sure you want to override this action?" within "#cboxContent"
Then I should see "Cancel" within "#cboxContent"
# Then show me the page
When I follow "Cancel" within "#cboxContent"
Выдает эту ошибку:
Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError)
[remote server] resource://fxdriver/modules/atoms.js:7903:in `'
[remote server] file:///var/folders/nn/nn5oYAICGPawlH 1W406 k TI/-Tmp-/webdriver-profile20110524-2973-1d5qq7w/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:249:in `'
[remote server] file:///var/folders/nn/nn5oYAICGPawlH 1W406 k TI/-Tmp-/webdriver-profile20110524-2973-1d5qq7w/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:298:in `'
[remote server] file:///var/folders/nn/nn5oYAICGPawlH 1W406 k TI/-Tmp-/webdriver-profile20110524-2973-1d5qq7w/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:313:in `'
[remote server] file:///var/folders/nn/nn5oYAICGPawlH 1W406 k TI/-Tmp-/webdriver-profile20110524-2973-1d5qq7w/extensions/fxdriver@googlecode.com/components/nsCommandProcessor.js:190:in `'
./features/step_definitions/web_steps.rb:35
./features/step_definitions/web_steps.rb:14:in `with_scope'
./features/step_definitions/web_steps.rb:14:in `with_scope'
./features/step_definitions/web_steps.rb:34:in `/^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/'
features/prerequisites.feature:38:in `When I follow "Cancel" within "#cboxContent"'
Кто-нибудь видел эту ошибку раньше и как вы ее обходили? (Если я раскомментирую шаг «покажите мне страницу», это также сработает)
Комментарии:
1. Похоже, что вызов $.fn.colorbox не завершается к тому времени, когда я пытаюсь перейти по ссылке Cancel (поэтому он все еще скрыт внутри другого div). Я пытаюсь найти наилучший способ заставить capybara / selenium ждать, пока div станет видимым.
Ответ №1:
У меня аналогичная проблема с Jquery-mobile framework.
Насколько я понимаю, Capybara должна дождаться завершения всех вызовов AJAX, прежде чем выполнять проверку или двигаться дальше. Однако, если у вас возникла проблема, из-за которой, по вашему мнению, загрузка страницы не завершена, вы могли бы попробовать добавить простой «sleep 1» в стандартный шаг Capybara «I press», чтобы посмотреть, поможет ли это.
Комментарии:
1. Да — sleep 1 также работает. Я думаю, проблема в том, что в colorbox есть шаг анимации, который занимает несколько миллисекунд — так что вызов ajax выполнен, но анимация — нет. Я думаю, что правильным ответом должно быть какое-то использование selenium.wait_for_condition, но я не могу понять, как вызвать это в моих шагах cucumber («selenium.browserbot.GetCurrentWindow().document.getElementById(‘colorbox’).style.display == ‘block'»). Вероятно, у меня будет много таких шагов для всего моего набора тестов, и время ожидания 1 начнет складываться!