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

时间:2011-08-03 17:55:34

标签: ruby-on-rails testing capybara

我尝试了几个在线发现的例子,但没有运气。我期待确认删除链接的确认消息。最后一次尝试是下面的代码,但是导致了Capybara :: NotSupportedByDriverError错误。

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

8 个答案:

答案 0 :(得分:51)

首先,通过在场景前添加@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所说,这个问题在此之前已被提出并回答:How to test a confirm dialog with Cucumber?

此处提供了更多的硒文档:http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

答案 1 :(得分:41)

为2016年及以后的人提供答案。您现在可以直接使用Capybara接受确认框。您可以通过包装导致确认框出现在accept_confirm函数中的代码来完成此操作。

accept_confirm do
  click_link 'Destroy'
end

答案 2 :(得分:15)

for 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”

答案 3 :(得分:9)

我在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

答案 4 :(得分: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

答案 5 :(得分:2)

我猜你必须在你的宝石文件中添加selenium并配置它和capybara capybara使用selenium作为驱动程序。

我认为How to test a confirm dialog with Cucumber?与您的问题非常相似,尤其是接受的答案。

答案 6 :(得分:2)

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

  

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

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

答案 7 :(得分:2)

在Capybara,它非常简单地接受模型窗口。即使我们也可以在硒中做同样的事情,但对于那些不了解硒的人来说,这有点难度。

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

page.dismiss_modal#这将拒绝/取消模态窗口