我如何确认一个javascript弹出与Capybara



我尝试了几个在网上找到的例子,但没有运气。我正在寻找确认一个删除链接的确认消息。最后一次尝试是下面的代码,但这导致Capybara::NotSupportedByDriverError错误。

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

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

accept_confirm do
  click_link 'Destroy'
end

首先,在你的场景前面放一个@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的确认对话框?

更多的selenium文档也可以在这里获得:http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

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_confires "

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

我不得不在webkit测试中使用sleep,因为它会时不时地失败。

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

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

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

RSpec的元数据特性可以用来切换到不同的驱动程序。使用:js => true切换到javascript驱动程序,或者提供一个:driver选项,切换到指定驱动。例如:

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

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

页面。accept_modal #这将接受模式窗口

页面。这将拒绝/取消模式窗口

我猜你必须将selenium添加到gem文件中,并配置它和capybara, capybara使用selenium作为驱动程序。

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

最新更新