Как проверить диалог подтверждения с помощью огурца?

Я использую Ruby on Rails с Cucumber и Capybara.

Как мне протестировать простую команду подтверждения («Вы уверены?»)?

Кроме того, где я могу найти дополнительную документацию по этому вопросу?


person Yuval Karmi    schedule 16.03.2010    source источник
comment
Если вы используете Capybara-webkit, вы найдете там свой ответ: stackoverflow.com/questions/6930927/   -  person Adrien    schedule 18.02.2014


Ответы (9)


Похоже, что в Capybara, к сожалению, этого не сделать. Но если вы запускаете свои тесты с драйвером Selenium (и, возможно, с другими драйверами, поддерживающими JavaScript), вы можете его взломать. Непосредственно перед выполнением действия, которое вызовет диалоговое окно подтверждения, переопределите метод confirm, чтобы он всегда возвращал true. Таким образом, диалоговое окно никогда не будет отображаться, и ваши тесты могут продолжаться, как если бы пользователь нажал кнопку ОК. Если вы хотите смоделировать обратное, просто измените его так, чтобы он возвращал false.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
person Theo    schedule 09.04.2010
comment
Похоже, что это больше не работает в Firefox 4 ... решение @ derek-ekins, приведенное ниже, судя по тому, что мне сообщает Google, кажется более совместимым, хотя я пока не могу подтвердить (я застрял на Capybara 0.3.9). - person carpeliam; 06.04.2011
comment
См. Ответ ниже для использования page.driver.browser.switch_to ... - person Thorbjørn Hermansen; 24.02.2012

Драйвер selenium теперь поддерживает это

Из Capybara вы получите доступ к нему следующим образом:

page.driver.browser.switch_to.alert.accept

or

page.driver.browser.switch_to.alert.dismiss

or

 page.driver.browser.switch_to.alert.text
person Derek Ekins    schedule 15.02.2011
comment
Для всех, кто следит за этим - обратите внимание, что ответ Дерека действительно работает, где я обнаружил, что код в официальной документации Selenium не работает (огурец / Selenium). Обратите внимание на присутствие page.driver.browser в ответе Дерека. - person Peter Nixey; 31.07.2011
comment
Питер - код здесь специально разработан для использования capybara, тогда как код в документации предназначен для случая, когда вы напрямую используете selenium-webdriver - я тоже написал этот пример, поэтому надеюсь, что он сработает! - person Derek Ekins; 01.08.2011
comment
Ах. Да, хорошая мысль, которую я полностью упустил. В таком случае спасибо за оба примера. - person Peter Nixey; 01.08.2011

Я реализовал эти два веб-шага в /features/step_definitions/web_steps.rb:

When /^I confirm popup$/ do
  page.driver.browser.switch_to.alert.accept    
end

When /^I dismiss popup$/ do
  page.driver.browser.switch_to.alert.dismiss
end
person Dynamick    schedule 12.05.2011

Если вы хотите специально протестировать отображаемое сообщение, вот особенно хитрый способ сделать это. Я не одобряю его как красивый код, но он выполняет свою работу. Вам нужно будет загрузить http://plugins.jquery.com/node/1386/release, или измените его, чтобы файлы cookie были изначально, если вам не нужен jQuery.

Используйте такую ​​историю:

Given I am on the menu page for the current booking
And a confirmation box saying "The menu is £3.50 over budget. Click Ok to confirm anyway, or Cancel if you want to make changes." should pop up
And I want to click "Ok"
When I press "Confirm menu"
Then the confirmation box should have been displayed

И эти шаги

Given /^a confirmation box saying "([^"]*)" should pop up$/ do |message|
  @expected_message = message
end

Given /^I want to click "([^"]*)"$/ do |option|
  retval = (option == "Ok") ? "true" : "false"

  page.evaluate_script("window.confirm = function (msg) {
    $.cookie('confirm_message', msg)
    return #{retval}
  }")
end

Then /^the confirmation box should have been displayed$/ do
  page.evaluate_script("$.cookie('confirm_message')").should_not be_nil
  page.evaluate_script("$.cookie('confirm_message')").should eq(@expected_message)
  page.evaluate_script("$.cookie('confirm_message', null)")
end
person Jon Wood    schedule 15.11.2010
comment
Классное решение! Я немного перевернул его, что мне показалось более естественным: gist.github.com/727614 - person Mat Schaffer; 04.12.2010
comment
А вот еще одна версия этого кода, которая поддерживает как предупреждения, так и окна подтверждения, gist.github.com/919116. - person Matthew O'Riordan; 14.04.2011

Обновление для текущих выпусков Capybara. Большинство драйверов Capybara сегодня поддерживают модальный API. Чтобы принять модальное окно подтверждения, вы должны сделать

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

Это можно использовать в огурце с чем-то вроде

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

который щелкнет названную кнопку, а затем примет окно подтверждения с текстом, совпадающим с сообщением

person Thomas Walpole    schedule 26.01.2016

Драйвер capybara-webkit также поддерживает это.

person regulatethis    schedule 15.12.2012

Prickle добавляет несколько удобных удобных методов для работы со всплывающими окнами в selenium и webkit.

person Chris Bloom    schedule 15.05.2012

Эта суть содержит шаги по тестированию диалогового окна подтверждения JS в Rails 2 и 3 с любым драйвером Capybara.

Это адаптация предыдущего ответа, но не требует плагина jQuery Cookie.

person Joel Cogen    schedule 27.09.2011

Пробовал приведенные выше ответы безуспешно. В конце концов, это сработало для меня:

@browser.alert.ok
person Andy Stannard    schedule 16.09.2015