为什么Capybara功能测试不会等待?

时间:2016-06-30 13:49:11

标签: ruby-on-rails capybara integration-testing

我的测试套件遇到了一个小麻烦:当我运行spec检查页面上的ajax操作时,有时候会出现随机错误

Failure/Error: expect(page).to have_content 'DHH'

此错误很少显示(约1/100),但这让我很困惑。我决定这是一个竞争条件'因为,我在spec/rails_helper.rb

中添加了此配置
Capybara.default_max_wait_time = 10

但这对我没有帮助,我决定添加时间戳

  it 'adds new DHH', js: true do
    find('#modal_new_dhh').click
    fill_in('name', with: 'DHH')

    p 'click button'
    p Time.now.strftime('%H:%M:%S.%L')
    click_button('Submit')

    p 'checking content'
    p Time.now.strftime('%H:%M:%S.%L')
    expect(page).to have_content 'DHH'

    p 'after checking content'
    p Time.now.strftime('%H:%M:%S.%L')
  end

并看到

"click button"
"17:34:43.083"
"before checking content"
"17:34:43.127"
"after checking content"
"17:34:43.213"

为什么Capybara不会在点击按钮后等待?

抱歉我的英文不好

2 个答案:

答案 0 :(得分:2)

示例中的等待发生在have_content匹配器中。你输出时间的地方永远不会显示延迟因为click_button没有什么可以等待的,它只需点击一个按钮然后继续(因为它不知道它会等待什么,点击一个按钮可以做任何事情),但是,has_content匹配器将等待Capybara.default_max_wait_time以显示内容。

请注意您的find,' fill_in'并且click_button调用也会在执行操作之前等待相关元素出现

答案 1 :(得分:0)

正如你所说,这是一场竞争。至于它为什么会发生,我真的可以说,我能想到的唯一原因是用户体验和自动化测试之间存在差异,因为计算机速度非常快。

前一段时间我遇到了同样的挑战,我发现this tutorial向我展示了解决这类问题的方法。我希望它对你也有用。