46

I have gone through the post of capybara + click on alert box but nothing seems to be work. Following is my scenario:

Scenario: When I click update button An alert box appears which contains "OK" and "Cancel" button. Click on "Ok" then new form appears.

  1. I am writing request specs i.e. using rspec and capybara. Main problem is to click on the alert box: Following is my code:

     context "update" do
       before(:all) do
         Capybara.current_driver = :selenium
       end
       after(:all) do
         Capybara.use_default_driver
       end
    
       it "update user to trainer" do
         click_button('Search')
         sleep 3 
         page.evaluate_script('data-confirm = function() { return true; }')
         page.click('OK')      
         click_button('Upgrade')
       end
     end
    

    But executing script gives me following error:

    Failure/Error: page.evaluate_script('data-confirm = function() { return true; }') Selenium::WebDriver::Error::UnexpectedJavascriptError: invalid assignment left-hand side # ./spec/requests/user_upgrades_spec.rb:30

  2. For the second example i.e.

    page.driver.browser.switch_to.alert.accept

    My code :

     context "update" do
       before(:all) do
         Capybara.current_driver = :selenium
       end
       after(:all) do
         Capybara.use_default_driver
       end
       it "update user to trainer" do
         click_button('Search')
         sleep 3   
         click_button('Upgrade') 
         page.driver.browser.switch_to.alert.accept
       end
     end 
    

I get error:

Failure/Error: page.driver.browser.switch_to.alert.accept Selenium::WebDriver::Error::UnhandledError:

Please let me know how to proceed further

zetetic
  • 47,184
  • 10
  • 111
  • 119
Amit Kulkarni
  • 461
  • 1
  • 4
  • 3
  • You can't name a JavaScript variable with dashes. `data-confirm = function ...` is illegal. It looks like `(foo - bar) = function() { ... }`. That's the `left-hand side # ...user_upgrades_spec.rb:30` error. Name your JavaScript variables with camelCase. – Justin Force Jun 30 '14 at 22:25
  • http://stackoverflow.com/questions/27384040/test-alert-dialog-text-using-capybara-webkit-1-3-1 – Dylan L. Apr 05 '17 at 01:28

6 Answers6

38

You can click on an alert box like this:

page.driver.browser.switch_to.alert.accept
solnic
  • 5,733
  • 2
  • 23
  • 19
35

Updated answer here, since the options above seem to have all been deprecated.

Capybara::Session#accept_alert seems to be the best way to accomplish this now, where the action that will trigger the alert should be passed in a block. http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Session:accept_alert

e.g.:

page.accept_alert 'Alert text here' do
    click_button('Search')
end
Jillian Foley
  • 373
  • 3
  • 7
  • 1
    I'm getting an `undefined method `accept_alert' for #` even though per the docs, this is a method for `Capybara::Session`. Any thoughts? – james Jan 13 '15 at 08:16
  • Could be an older version of Capybara, `accept_alert` was introduced in [Capybara 2.4.1](https://github.com/jnicklas/capybara/blob/master/History.md#version-241). Consider running `bundle update capybara` – Eliot Sykes Jan 16 '15 at 18:37
26
page.accept_alert

worked for me using Selenium. Other drivers will probably have their own syntax.

As Jillian Foley mentioned, it seems that other answers have been deprecated.

B Seven
  • 44,484
  • 66
  • 240
  • 385
15

For WebKit:

page.accept_confirm { click_button "Upgrade" }

For Selenium:

page.driver.browser.switch_to.alert.accept
HectorPerez
  • 744
  • 6
  • 11
13

Try this line if you want to click on the ok button of the alert box:

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

Don't forget to mark your test with the javascript flag

it "update user to trainer", js: true do
    ...
end

and enable Capybara.javascript_driver with :webkit or :selenium in your spec_helper file

chrisvanhill
  • 217
  • 3
  • 7
7

I know this is old but this now works in poltergeist too:

page.accept_alert
stujo
  • 2,089
  • 24
  • 29