来自Capybara的弃用警告

时间:2014-10-09 09:49:38

标签: ruby-on-rails rspec capybara capybara-webkit

我使用rspec-rails 2.14.0.rc1和capybara 2.4.1从rails 3.2.19升级到rails 4.1.5。所有测试都通过了,我只剩下一个弃用警告:

[DEPRECATION] Capybara::Webkit::Driver#accept_js_confirms! is deprecated. Please use Capybara::Session#accept_confirm instead.

导致此问题的代码行是

page.driver.accept_js_confirms!

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

5 个答案:

答案 0 :(得分:10)

鉴于例外情况:

  

请改用Capybara :: Session#accept_confirm。

你可能想要:

page.accept_confirm

请注意,正在对Capybara :: Session而不是驱动程序运行accept_confirm

此方法需要一个触发确认警报的块。例如:

page.accept_confirm do
  click_link('that_opens_confirm')
end

答案 1 :(得分:5)

贾斯汀柯的答案对#accept_confirm的用法是正确的 - 它是

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。尽管如此,它还没有出现在版本中。

答案 2 :(得分:3)

Justin Ko的回答让我获得了50/50的成功。工作的那个有这样的代码:

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哈希,所以我的代码被破坏但是{{1}测试没有把它拿起来。所以这值得追踪。

答案 3 :(得分: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与SOMETHING其他,但我无法弄清楚该块中的内容或传递。

答案 4 :(得分:0)

适合我的作品:

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