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

StackOverflow https://stackoverflow.com/questions/2458632

Вопрос

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

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

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

Это было полезно?

Решение

Похоже, что в 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

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

Это можно использовать в 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

Колючка добавляет несколько удобных методов для работы со всплывающими окнами в Selenium и Webkit.

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

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

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

@browser.alert.ok
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top