Capybara的弃用警告

9
我正在升级从 Rails 3.2.19 到 Rails 4.1.5,使用 rspec-rails 2.14.0.rc1 和 capybara 2.4.1。所有测试都成功了,我只剩下一个废弃警告:
[DEPRECATION] Capybara::Webkit::Driver#accept_js_confirms! is deprecated. Please use Capybara::Session#accept_confirm instead.

导致这个问题的代码行是:
page.driver.accept_js_confirms!

如何更改这行以消除弃用警告?


page.driver.browser.accept_confirm? - coorasse
我也尝试过这个,因为我遇到了同样的问题。但是它并没有起作用。看起来它确实能够识别accept_modal(:confirm, options, &blk) ,但会出现一个参数错误。我仍在寻找答案。 - Art
5个回答

11

考虑到异常信息提示:

请使用Capybara :: Session#accept_confirm。

您可能需要执行以下操作:

page.accept_confirm

请注意,accept_confirm方法是针对Capybara::Session而不是驱动程序运行的。

该方法需要一个触发确认提示框出现的块。例如:

page.accept_confirm do
  click_link('that_opens_confirm')
end

这很有帮助,但还是不太明白。我正在使用cucumber,并且在page.driver.console_messages.first下的上一个步骤中弹出了提示。通过使用page.accept_confirm切换会话应该可以解决问题,但由于我没有传递任何内容,所以并没有起作用。虽然我还是个新手 :) - Art
实际上,我添加了这个块:page.accept_confirm do click_button('Ok) end,但它不起作用。显示找不到“确定”按钮,但我正在盯着它,所以它肯定在那里。 - Art
@Art,您在添加accept_confirm之前是否能够点击按钮?那个“OK”按钮实际上是触发确认警报打开的按钮吗?该块不应该是关闭警报的按钮。 - Justin Ko
在浏览器中,实际上有一个“确定”按钮。我尝试过click_link(“OK”)和click_button(“OK”),但都没有找到。而且,使用accept_js_confirms!方法确实可以(并且仍然可以)工作。之前我提供的方法显然也有效。只是想看到这个成功,这样我就感觉自己做到了:)。 - Art
触发警报的按钮是“取消我的帐户”,它会弹出一个对话框,“您确定吗?”有一个OK和Cancel选项。我在之前打开了它,并使用上一步中的page.driver.console_messages.first评估了弹出窗口。我猜我应该以不同的方式编写这些内容。我在规范中看到了xpath的期望,所以可能会尝试使用它。 - Art
显示剩余2条评论

6
贾斯汀·科的回答关于#accept_confirm的使用是正确的 - 这是一个在测试中用于处理弹出确认框的Capybara方法。
page.accept_confirm do
  #code that will trigger the modal
end

或者你可以这样做。
page.accept_confirm 'Are you sure?' do
  #code that will trigger the modal
end

您需要验证确认框中显示的“您确定吗?”提示吗?

在您的失败测试中,您是否先处理了其他模态框?capybara-webkit 几天前修复了多个模态框的错误 - https://github.com/thoughtbot/capybara-webkit/commit/86e422f94422d39e537329d64d7bfe8f6360bd8b。但这还没有被发布。


是的,我有两个模态框。我将它们分成了两个不同的场景,两个测试都通过了。除了你提到的错误之外,一切都好。 - Obromios

3

我对Justin Ko的答案有一半的成功率。其中可行的代码如下:

link_to "Reset", reset_pre_shot_description_mental_game_path(@mental_game), data: {confirm: 'Are you sure?'}, class: "small_button round", id: "reset_pre-shot"

并且这是一个测试:

page.accept_confirm do
  click_link "Reset"
end

测试失败的代码(但在浏览器中可以正常工作)有代码

link_to 'Delete', micropost, data: {confirm: 'Are you sure?'}, method: :delete

并测试

page.accept_confirm do
  click_link "Delete"
end

失败信息为

Failure/Error: page.accept_confirm do
Capybara::ModalNotFound:
  Timed out waiting for modal dialog

我试图将 method: :delete 移到 :data 哈希中,但这并没有帮助。

事实证明,弃用警告实际上发现了代码中的两个错误,因为我在使用 Rails 3 语法来确认,即没有使用 :data 哈希,所以我的代码已经损坏,但是 page.driver.accept_js_confirms! 测试并没有检测到。因此,这是值得追踪的。


如对于用户2209090的错误识别所提到的,测试中有两个模态框。当我将它们分别放入不同的场景中时,“删除”测试就可以正常工作了。因此,我现在将Justin Ko的答案视为100%正确,并附上对user229090答案中错误的说明。 - Obromios

0

我用以下代码替换了 page.driver.accept_js_confirms!:

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

测试通过了。

这段代码来自文档:http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#evaluate_script-instance_method,并得到了网上的帮助。现在,我们仍然不知道如何使用 accept_confirm,所以我仍在寻找答案。

实际代码如下:

# Execute the block, accepting a confirm.
#
# @macro modal_params
#
def accept_confirm(text_or_options=nil, options={}, &blk)
  if text_or_options.is_a? Hash
    options=text_or_options
  else
    options[:text]=text_or_options
  end

  driver.accept_modal(:confirm, options, &blk)
 end

说实话,我认为只是使用page.accept_confirm和其他一些内容,但是我无法弄清楚那个块传入了什么。

0

对我来说完美运作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接