How to test a confirm dialog with Cucumber?

Automated TestsCapybaraIntegration Testing

Automated Tests Problem Overview


I am using Ruby on Rails with Cucumber and Capybara.

How would I go about testing a simple confirm command ("Are you sure?")?

Also, where could I find further documentation on this issue?

Automated Tests Solutions


Solution 1 - Automated Tests

The selenium driver now supports this

From Capybara you would access it like this:

page.driver.browser.switch_to.alert.accept

or

page.driver.browser.switch_to.alert.dismiss

or

 page.driver.browser.switch_to.alert.text

Solution 2 - Automated Tests

Seems like there's no way to do it in Capybara, unfortunately. But if you're running your tests with the Selenium driver (and probably other drivers that support JavaScript), you can hack it. Just before performing the action that would bring up the confirm dialog, override the confirm method to always return true. That way the dialog will never be displayed, and your tests can continue as if the user had pressed the OK button. If you want to simulate the reverse, simply change it to return false.

page.evaluate_script('window.confirm = function() { return true; }')
page.click('Remove')

Solution 3 - Automated Tests

I've implemented these two web steps in /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

Solution 4 - Automated Tests

If you want to specifically test the message being displayed, here's a particularly hacky way to do so. I don't endorse it as beautiful code, but it gets the job done. You'll need to load http://plugins.jquery.com/node/1386/release, or change it to do cookies natively if you don't want jQuery.

Use this sort of story:

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

And these steps

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

Solution 5 - Automated Tests

Updating this for current releases of Capybara. Most Capybara drivers today support the modal API. To accept a confirm modal you would do

accept_confirm do  # dismiss_confirm if not accepting
  click_link 'delete'  # whatever action triggers the modal to appear
end

This can be used in Cucumber with something like

When /^(?:|I )press "([^"]*)" and confirm "([^"]*)"$/ do |button, msg|
  accept_confirm msg do
    click_button(button)
  end
end

which will click the named button and then accept a confirm box with text matching msg

Solution 6 - Automated Tests

The capybara-webkit driver supports this as well.

Solution 7 - Automated Tests

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

Solution 8 - Automated Tests

Prickle adds some handy convenience methods for working with popups in selenium and webkit

Solution 9 - Automated Tests

This gist has steps to test a JS confirm dialog in Rails 2 and 3 with any Capybara driver.

It's an adaptation of a previous answer, but doesn't need the jQuery Cookie plugin.

Solution 10 - Automated Tests

Tried the above answers with no luck. In the end this worked for me:

@browser.alert.ok

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionYuval KarmiView Question on Stackoverflow
Solution 1 - Automated TestsDerek EkinsView Answer on Stackoverflow
Solution 2 - Automated TestsTheoView Answer on Stackoverflow
Solution 3 - Automated TestsDynamickView Answer on Stackoverflow
Solution 4 - Automated TestsJon WoodView Answer on Stackoverflow
Solution 5 - Automated TestsThomas WalpoleView Answer on Stackoverflow
Solution 6 - Automated TestsregulatethisView Answer on Stackoverflow
Solution 7 - Automated TestsHai NguyenView Answer on Stackoverflow
Solution 8 - Automated TestsChris BloomView Answer on Stackoverflow
Solution 9 - Automated TestsJoel CogenView Answer on Stackoverflow
Solution 10 - Automated TestsAndy StannardView Answer on Stackoverflow