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

Why Capybara feature tests don't wait?

我的测试套件有一个小问题:当我 运行 指定页面上的检查 ajax 操作时,有时会出现随机错误

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

这个错误很少出现(大约 1/100),但这让我很困惑。我认为这是一个 'race condition' 原因,我将此配置添加到我的 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"

为什么水豚在点击按钮后不等待?

抱歉我的英语不好

正如你所说,这是一个竞争条件。至于为什么会这样,我真的不能说,我能想到的唯一原因是用户体验和自动化测试之间存在差异,因为计算机非常快。

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

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

请注意,您的 find、'fill_in' 和 click_button 调用也会等待相关元素出现,然后再执行它们的操作