Capybara没有等到click_button完成提交操作" Save"

时间:2017-03-07 15:22:02

标签: ruby-on-rails selenium-webdriver rspec capybara

我有以下rspec片段:

   describe "Save should create a ClassificationScheme" do
      subject { lambda { click_button "Save"; sleep 1 } }
      it { should change(ClassificationScheme, :count).by(1) 
   end

没有"睡眠1" capybara不会等待保存按钮触发的操作,并且规范失败。睡眠1可以,但有没有更好的解决方案?

请注意,此测试使用selenium webdriver在Firefox中运行。

我的版本:

  • rails 4.1.12
  • rspec 2.99.0
  • capybara 2.4.4
  • selenium-webdriver 3.2.1
  • firefox 51.0.1

2 个答案:

答案 0 :(得分:0)

您没有包含提交操作的代码,但如果有任何异步,例如Ajax请求,则提交操作本身将快速完成,而异步任务仍在处理请求。如果是这种情况,您可以使用这样的帮助:

# spec/support/wait_for_ajax.rb
module WaitForAjax
  def wait_for_ajax
    Timeout.timeout(Capybara.default_max_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end
end

RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
end

代码礼貌Thoughtbot

注意,这仅包含功能规格中的帮助程序;因此,要么使用type: :feature标记您的规范,要么更改上面的config.include行,以便将其包含在您正在使用的任何规范类型中。

使用它:

describe "Save should create a ClassificationScheme" do
    subject { lambda { click_button "Save"; wait_for_ajax } }
    it { should change(ClassificationScheme, :count).by(1) 
end

答案 1 :(得分:0)

当您使用Capybara单击某些内容时,无法保证在该方法返回时该单击触发的任何操作已完成。这是因为Capybara对浏览器的功能一无所知,只需点击屏幕上的元素即可。您不需要睡觉,而是需要检查页面上可视更改的内容,以指示单击按钮已完成触发的操作。这可能是一条消息,说明保存成功或元素消失等等。

的内容
describe "Save should create a ClassificationScheme" do
  subject { lambda { click_button "Save"; page.should have_text('Classification Saved' } }
  it { should change(ClassificationScheme, :count).by(1) 
end

注意:您还应该更新Capybara - 2014年10月发布的2.4.4,自那时起已经有很多改进。