如何使用Capybara确认JavaScript弹出窗口?


73

我已经尝试了几个在网上找到的示例,但是没有运气。我希望确认删除链接的确认消息。最后的尝试是下面的代码,但是导致Capybara :: NotSupportedByDriverError错误。

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


请参阅我的答案以获取更新的方法:stackoverflow.com/a/26472467/2170577
Jillian Foley 2014年

Answers:


59

为2016年及以后实现这一目标的人添加答案。现在,您可以直接使用水豚来接受确认框。您可以通过包装使确认框显示在accept_confirm函数。

accept_confirm do
  click_link 'Destroy'
end

54

首先,通过在场景前面放置@javascript标记,将Selenium用作驱动程序。

黄瓜步骤中的以下代码将确认对话框:

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

正如@NobbZ所说,此问题在此之前已被问过并回答过:如何用Cucumber测试确认对话框?

这里也提供了更多硒文档:http : //code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs


4
#<Capybara :: RackTest :: Browser:0x007ffca8a79890>的未定义方法`switch_to'–
Dima

1
我遇到了未定义的方法错误,然后发现我根本不需要switch_to调用,因为硒(我认为)在任何确认时都会自动返回true。那不会帮助所有人,但可能会帮助一些人。
elc 2013年

1
@DimaGoltsman您正在使用RackTest。答案是指硒驱动器。您需要在测试运行之前设置驱动程序,Capybara.current_driver = :selenium否则在示例中添加js:true即可将驱动程序:selenium默认设置为默认值Capybara.javascript_driver
iNulty 2013年

在Rails中使用Selenium驱动程序与Capybara一起使用。谢谢
luigi7up 2014年

我尝试使用,page.driver.browser.switch_to但收到了DEPRECATION警告,但被提示:stackoverflow.com/questions/26275359/…–
echo

15

对于capybara-webkit:

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

仍然可以使用,但是文档中还显示:

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

参见https://github.com/thoughtbot/capybara-webkit,搜索“ accept_js_confirms”


2
它对我有用page.driver.accept_js_confirms!(确实是从github.com/thoughtbot/capybara-webkit
阿德里安

1
目前,此行适用于水豚:page.driver.browser.switch_to.alert.accept
swilgosz 2014年

看起来您的其中一个应该是page.driver.reject_js_confirms!
retroGiant

10

在CI环境中,浏览器对话框存在计时问题,因此在接受之前先轮询一个对话框:

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

6

我必须在webkit测试中使用睡眠,因为它会立即失败,否则会失败。

这是我阅读每个人的帖子后想到的:

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

是的,请务必小心不要添加过多的测试,这会使您的测试运行起来确实非常昂贵(即,由于睡眠,它们将花费更长的时间)
Michael Yagudaev

3

在Capybara中,接受模型窗口非常简单。甚至我们也可以在硒中做同样的事情,但是对于不了解硒的人们来说,这很难。

page.accept_modal#这将接受模态窗口

page.dismiss_modal#这将拒绝/关闭模态窗口


这让我回来了NoMethodError: private method 'accept_modal' called for #<Capybara::Session>
Ruff9

2

我猜想您必须将硒添加到您的gem文件中并对其进行配置,并且必须使capybara使用capybara使用硒作为驱动程序。

我也认为如何用黄瓜测试确认对话框?与您的问题非常相似,尤其是已接受的答案。


2

尝试添加:js => true到您的测试中。

RSpec的元数据功能可用于切换到其他驱动程序。使用:js => true可以切换到javascript驱动程序,或者提供:driver选项可以切换到一个特定的驱动程序。例如:

it 'will use the default js driver' :js => true do
  ...
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.