Как проверить диалог подтверждения с огурцом? - PullRequest
85 голосов
/ 17 марта 2010

Я использую Ruby on Rails с огурцом и капибарой.

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

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

Ответы [ 10 ]

133 голосов
/ 15 февраля 2011

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

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

page.driver.browser.switch_to.alert.accept

или

page.driver.browser.switch_to.alert.dismiss

или

 page.driver.browser.switch_to.alert.text
60 голосов
/ 09 апреля 2010

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

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')
39 голосов
/ 12 мая 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
8 голосов
/ 15 ноября 2010

Если вы хотите специально протестировать отображаемое сообщение, вот очень хакерский способ сделать это. Я не одобряю это как красивый код, но он выполняет свою работу. Вам нужно будет загрузить 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
3 голосов
/ 26 января 2016

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

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

2 голосов
/ 26 мая 2014
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
2 голосов
/ 15 декабря 2012

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

1 голос
/ 15 мая 2012

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

0 голосов
/ 16 сентября 2015

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

@browser.alert.ok
0 голосов
/ 27 сентября 2011

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

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

...