Как я могу заставить selenium / cucumber взаимодействовать со «скрытой» ссылкой, которая теперь находится в лайтбоксе / colorbox?

#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 начнет складываться!