Eric M.
Eric M.

Reputation: 5529

How do I confirm a javascript popup with Capybara?

I've tried several examples found online, but with no luck. I am looking to confirm the confirm message of a delete link. The last attempt was the code below, but that resulted in an Capybara::NotSupportedByDriverError error.

def confirm_dialog
  page.evaluate_script('window.confirm = function() { return true; }')
end

Upvotes: 85

Views: 51234

Answers (8)

Lee Dykes
Lee Dykes

Reputation: 1127

Adding an answer for those hitting this in 2016 and beyond. You can now use Capybara directly to accept a confirmation box. You do this by wrapping the code that causes the confirmation box to appear in the accept_confirm function.

accept_confirm do
  click_link 'Destroy'
end

Upvotes: 96

Jagan
Jagan

Reputation: 79

In Capybara its very simple to accept the model window. Even we can do the same in selenium but its little tough for people who are not aware about selenium.

page.accept_modal #This will accept the modal window

page.dismiss_modal #This will Reject/Dismiss the modal window

Upvotes: 3

user1083709
user1083709

Reputation:

for capybara-webkit:

page.driver.browser.accept_js_confirms
page.driver.browser.reject_js_confirms

which is still working, but the documentation says also:

page.driver.accept_js_confirms!
page.driver.accept_js_confirms!

See https://github.com/thoughtbot/capybara-webkit , search "accept_js_confirms"

Upvotes: 16

seidtgeist
seidtgeist

Reputation: 101

I've had timing issues with browser dialogs in a CI environment so I'm polling for a dialog before accepting it:

def accept_browser_dialog
  wait = Selenium::WebDriver::Wait.new(:timeout => 30)
  wait.until {
    begin
      page.driver.browser.switch_to.alert
      true
    rescue Selenium::WebDriver::Error::NoAlertPresentError
      false
    end
  }
  page.driver.browser.switch_to.alert.accept
end

Upvotes: 10

Michael Yagudaev
Michael Yagudaev

Reputation: 6129

I had to use a sleep in the webkit test since it would fail everynow and then otherwise.

Here is what I came up with after reading everyones posts:

if page.driver.class == Capybara::Selenium::Driver
  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.accept_js_confirms
else
  raise "Unsupported driver"
end

Upvotes: 6

Peter Nixey
Peter Nixey

Reputation: 16565

First of all switch to using Selenium as the driver by putting an @javascript tag in front of your scenario.

The following code in your cucumber step will then confirm the dialogue:

page.driver.browser.switch_to.alert.accept
# or
page.driver.browser.switch_to.alert.dismiss
# or
page.driver.browser.switch_to.alert.text

As @NobbZ said, this question has been asked and answered before here: How to test a confirm dialog with Cucumber?.

More selenium documentation available here too: http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

Upvotes: 57

Vasiliy Ermolovich
Vasiliy Ermolovich

Reputation: 24617

try to add :js => true to your test.

RSpec’s metadata feature can be used to switch to a different driver. Use :js => true to switch to the javascript driver, or provide a :driver option to switch to one specific driver. For example:

it 'will use the default js driver' :js => true do
  ...
end

Upvotes: 3

NobbZ
NobbZ

Reputation: 1370

I would guess that you have to add selenium to your gem-file and configure it and capybara that capybara uses selenium as the driver.

I think also that How to test a confirm dialog with Cucumber? is very similar to your question, especially the accepted answer.

Upvotes: 2

Related Questions