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

86

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

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

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

Юваль Карми
источник
Если вы используете Capybara-webkit, вы найдете там свой ответ: stackoverflow.com/questions/6930927/…
Адриан

Ответы:

62

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

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
Тео
источник
Похоже, что это больше не работает в Firefox 4 ... решение @ derek-ekins ниже, судя по тому, что мне сообщает Google, похоже, более совместимо, хотя я пока не могу подтвердить (я застрял на Capybara 0.3.9).
Carpeliam
1
См. Ответ ниже об использовании "page.driver.browser.switch_to ..."
Торбьёрн Хермансен
134

Драйвер селена теперь поддерживает это

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

page.driver.browser.switch_to.alert.accept

или

page.driver.browser.switch_to.alert.dismiss

или

 page.driver.browser.switch_to.alert.text
Дерек Экинс
источник
2
Для всех, кто следит за этим - обратите внимание, что ответ Дерека действительно работает, когда я обнаружил, что код в официальной документации Selenium не работает (огурец / Selenium). Обратите внимание на присутствие page.driver.browserв ответе Дерека
Питер Никси
Питер - код здесь специально разработан для использования capybara, тогда как код в документации предназначен для прямого использования selenium-webdriver - я тоже написал этот пример, поэтому надеюсь, что он сработает!
Дерек Экинс
Ах. Да, хорошая мысль, которую я полностью упустил. В таком случае спасибо за оба примера.
Питер Никси 01
39

Я реализовал эти два веб-шага в /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
Dynamick
источник
8

Если вы хотите специально протестировать отображаемое сообщение, вот особенно хитрый способ сделать это. Я не одобряю его как красивый код, но он выполняет свою работу. Вам нужно будет загрузить 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
Джон Вуд
источник
2
Классное решение! Я немного перевернул его, что мне кажется более естественным: gist.github.com/727614
Mat Schaffer
А вот еще одна версия этого кода, которая поддерживает как предупреждения, так и окна подтверждения, gist.github.com/919116
Мэтью О'Риордан,
3

Обновление для текущих выпусков 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

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

Томас Уолпол
источник
2
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
Hainguyen
источник
1

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

Крис Блум
источник
0

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

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

Джоэл Коген
источник
0

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

@browser.alert.ok
Энди Стэннард
источник