Как проверить диалог подтверждения с огурцом?
Я использую Ruby on Rails с огурцом и капибарой.
Как мне проверить простую команду подтверждения ("Вы уверены?")?
Кроме того, где я могу найти дополнительную документацию по этому вопросу?
10 ответов
Похоже, что в Капибаре нет возможности сделать это, к сожалению. Но если вы запускаете свои тесты с драйвером Selenium (и, возможно, другими драйверами, поддерживающими JavaScript), вы можете взломать его. Непосредственно перед выполнением действия, которое вызовет диалог подтверждения, переопределите confirm
метод всегда возвращать истину. Таким образом, диалоговое окно никогда не будет отображаться, и ваши тесты могут продолжаться, как если бы пользователь нажал кнопку OK. Если вы хотите смоделировать обратное, просто измените его на false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Драйвер селена теперь поддерживает это
Из Капибары вы получите к нему доступ так:
page.driver.browser.switch_to.alert.accept
или же
page.driver.browser.switch_to.alert.dismiss
или же
page.driver.browser.switch_to.alert.text
Я реализовал эти два веб-шага в /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
Если вы хотите специально протестировать отображаемое сообщение, вот особенно хакерский способ сделать это. Я не одобряю это как красивый код, но он выполняет свою работу. Вам нужно будет загрузить 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
Обновление это для текущих выпусков 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
который нажмет на названную кнопку и затем примет поле подтверждения с текстом, соответствующим сообщению
Scenario: Illustrate an example has dialog confirm with text
#
When I confirm the browser dialog with tile "Are you sure?"
#
=====================================================================
my step definition here:
And(/^I confirm the browser dialog with title "([^"]*)"$/) do |title|
if page.driver.class == Capybara::Selenium::Driver
page.driver.browser.switch_to.alert.text.should eq(title)
page.driver.browser.switch_to.alert.accept
elsif page.driver.class == Capybara::Webkit::Driver
sleep 1 # prevent test from failing by waiting for popup
page.driver.browser.confirm_messages.should eq(title)
page.driver.browser.accept_js_confirms
else
raise "Unsupported driver"
end
end
Prickle добавляет несколько удобных удобных методов для работы с всплывающими окнами в Selen и WebKit.
Попробовал вышеуказанные ответы без везения. В конце концов это сработало для меня:
@browser.alert.ok
В этой части есть шаги для тестирования диалога подтверждения JS в Rails 2 и 3 с любым драйвером Capybara.
Это адаптация предыдущего ответа, но не нуждается в плагине jQuery Cookie.