为什么 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
调用也会等待相关元素出现,然后再执行它们的操作
我的测试套件有一个小问题:当我 运行 指定页面上的检查 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
调用也会等待相关元素出现,然后再执行它们的操作