水豚方法,wait_until
似乎不适用于capybara-webkit。是否有任何替代解决方案或任何Javascript实现?
有意需要替换sleep
,例如sleep 2
。
答案 0 :(得分:6)
您可以查看Thoughtbot撰写的此解决方案:here
我发现它非常有用。
答案 1 :(得分:5)
如果你的AJAX调用导致对DOM的更改,那么如果你这样做,Capybara会等待它
page.should have_selector?("some selector")
它是一个有意的Capybara功能,它等待(Capybara.default_wait_time
)have_selector?
并且相关方法为真。
如果你的AJAX调用没有导致对DOM的更改,那么使用Capybara就无法在浏览器端等待它。您可能能够在Javascript中检测到AJAX调用何时完成并以某种方式将其传达给Capybara,但这会将您的测试和实现紧密地联系起来。在这种情况下,常见的方法是等待AJAX调用的服务器端效果(创建或更新或删除模型对象,发送电子邮件等)。由于Capybara无法看到服务器端,因此您必须等待服务器端自行更改。
在Capybara 1中,您可以使用Capybara的wait_until
等待服务器端的更改。我从Capybara 2中删除了wait_until
。我在my answer向Why does adding "sleep 1" in an after hook cause this Rspec/Capybara test to pass?
wait_until
的实施内容
答案 2 :(得分:0)
也许是这样的:
# AJAX BEGIN
expect(page).to have_selector('form#new_user_video .submit > .throbber')
expect(page).to_not have_selector('form#new_user_video .submit > .throbber')
# AJAX END
手动输入你的js代码集' ajax:send' (追加悸动)和' ajax:成功' (删除throbber)。通过这种方式,您可以知道请求何时完成。
你应该为ajax设置足够的时间来完成:
Capybara.default_wait_time = 5
答案 3 :(得分:0)
我真的不需要期望,因为这不是我需要测试的东西。
这对我有用:
page.has_css?('.my-selector')
# or
page.has_content?('Some text on the page')
# continue with test