我的测试套件遇到了一个小麻烦:当我运行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不会在点击按钮后等待?
抱歉我的英文不好
答案 0 :(得分:2)
示例中的等待发生在have_content匹配器中。你输出时间的地方永远不会显示延迟因为click_button没有什么可以等待的,它只需点击一个按钮然后继续(因为它不知道它会等待什么,点击一个按钮可以做任何事情),但是,has_content匹配器将等待Capybara.default_max_wait_time以显示内容。
请注意您的find
,' fill_in'并且click_button
调用也会在执行操作之前等待相关元素出现
答案 1 :(得分:0)
正如你所说,这是一场竞争。至于它为什么会发生,我真的可以说,我能想到的唯一原因是用户体验和自动化测试之间存在差异,因为计算机速度非常快。
前一段时间我遇到了同样的挑战,我发现this tutorial向我展示了解决这类问题的方法。我希望它对你也有用。