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

Я использую 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

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

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

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

@browser.alert.ok

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

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

Другие вопросы по тегам