Я использую Ruby on Rails с Cucumber и Capybara.
Как мне протестировать простую команду подтверждения («Вы уверены?»)?
Кроме того, где я могу найти дополнительную документацию по этому вопросу?
Я использую Ruby on Rails с Cucumber и Capybara.
Как мне протестировать простую команду подтверждения («Вы уверены?»)?
Кроме того, где я могу найти дополнительную документацию по этому вопросу?
Ответы:
Похоже, в Capybara, к сожалению, этого не сделать. Но если вы запускаете свои тесты с драйвером Selenium (и, возможно, с другими драйверами, поддерживающими JavaScript), вы можете его взломать. Непосредственно перед выполнением действия, которое вызовет диалоговое окно подтверждения, переопределите confirm
метод, чтобы он всегда возвращал true. Таким образом, диалоговое окно никогда не будет отображаться, и ваши тесты могут продолжаться, как если бы пользователь нажал кнопку ОК. Если вы хотите смоделировать обратное, просто измените его, чтобы вернуть false.
page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Драйвер селена теперь поддерживает это
Из Capybara вы получите доступ к нему следующим образом:
page.driver.browser.switch_to.alert.accept
или
page.driver.browser.switch_to.alert.dismiss
или
page.driver.browser.switch_to.alert.text
page.driver.browser
в ответе Дерека
Если вы хотите специально протестировать отображаемое сообщение, вот особенно хитрый способ сделать это. Я не одобряю его как красивый код, но он выполняет свою работу. Вам нужно будет загрузить 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
Это можно использовать в Cucumber с чем-то вроде
When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
accept_confirm msg do
click_button(button)
end
end
который щелкнет названную кнопку, а затем примет окно подтверждения с текстом, совпадающим с сообщением
Водосвинка-WebKit драйвер поддерживает это , а также.
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
Это суть содержит шаги для тестирования диалогового окна подтверждения JS в Rails 2 и 3 с любым драйвером Capybara.
Это адаптация предыдущего ответа, но не требует плагина jQuery Cookie.
Пробовал приведенные выше ответы безуспешно. В конце концов, это сработало для меня:
@browser.alert.ok