我正在为我的rails应用程序创建集成测试。
我正在努力的应用程序有点慢。在我的测试中,我在网站内执行某个操作("保存" - 在页面末尾重新加载),并且在页面实际重新加载之前运行以下的capybara操作。
我无法使用"睡眠(秒)"因为这会冻结"重新加载"本身。
所以我想尝试一下这个github的想法:https://gist.github.com/metaskills/1172519
但是我收到以下错误:
NameError:未初始化的常量Capybara :: TimeoutError
有人可以告诉我为什么会收到此错误,这是什么意思?
答案 0 :(得分:0)
正如您发布的那样,您正在尝试制作一个等待ajax请求完成的方法。
但是有更好的方法可以做到这一点:
你有一个视图,它加载一个模态(远程,带有ajax)。你不应该像wait_until
方法那样做。或者即使没有使用while true
。
执行此操作的最佳方法是在模态内容上设置唯一的html元素:
<!-- in your modal view/partial -->
<span id="modal"></span>
... modal code
然后当你像这样使用Capybara时:
find("#modal")
find
方法会自动等待所有ajax请求完成。
有关更多输入,请参阅https://www.varvet.com/blog/why-wait_until-was-removed-from-capybara/。
答案 1 :(得分:0)
您收到错误的原因是因为Capybara v2中删除了Capybara::TimeoutError
类以及#wait_until
方法。正如@RaVeN所说,你应该告诉Capybara期望页面上的一些内容或元素会让Capybara等待它自动出现(只要你使用的是JS驱动程序)
expect(page).to have_content("Some content that appears after the page has loaded") # will wait up to Capybara.default_max_wait_time seconds for the content to appear
或者如果页面路径发生变化,您可以
expect(page).to have_current_path('<the new path you want to wait to load>')
顺便一提 - 测试中没有理由sleep
暂停页面加载,因为测试,应用程序,浏览器每个都在单独的线程/进程中运行,假设您正在运行支持JS的驱动程序。如果您没有运行支持JS的驱动程序而是使用默认的rack_test驱动程序,则等待/休眠任何事情都是没有意义的,因为每个操作都是同步发生的。