我在Rspec/Capybara中进行了一个非常简单的测试,显示出一些奇怪的行为。当我使用rspec <filename>
运行测试时,Capybara未能单击按钮,因此测试失败。如果我pry
测试,复制/粘贴相同的代码行,单击按钮,测试通过。我正在想办法解决这个问题。
测试:
context "when menu is open" do
before do
visit root_path
page.find("svg", class: "fa-bars").click
end
it "shows bars again once closed" do
page.find("svg", class: "fa-times").click(wait: 5)
expect(page).to have_css(".fa-bars")
end
end
在查找/单击之前放置binding.pry
,然后运行该行,工作正常。我有点困惑,为什么行为如此不同。
我们的系统测试在Selenium上运行:
config.before(:each, type: :system) do
if !!ENV['SYSTEM_TESTS_BROWSER_MODE']
driven_by :selenium, using: :firefox
else
driven_by :selenium_headless
end
end
当你说"未能点击",我假设你不是说你从page.find("svg", class: "fa-times").click(wait: 5)
得到一个错误,而是行正在进行很好,你的expect(page).to have_css(".fa-bars")
是什么实际失败。
考虑到这一点,你的描述告诉我Capybara实际上点击得很好,但它发生在菜单准备好将点击解释为关闭的意思之前。添加绑定时。你给了菜单打开的时间。关于传递wait
参数,您需要了解的是,它设置了Capybara等待元素存在的最大时间。如果元素在此时间之前存在,则Capybara将继续前进,因此当wait: 5
没有在该行出错时设置wait: 10
不会产生任何影响(条件已经满足-允许它等待更长时间是没有意义的)。您可以通过在查找/单击行之前放置sleep(2)
来确认这一点,以延迟查找和单击足够长的时间,以便在单击关闭菜单之前打开菜单。测试的正确修复方法是在测试环境中禁用动画(这样菜单就会立即打开),或者为菜单的某些状态添加额外的期望,表明它实际上是完全打开的,并准备接受点击关闭它。