2016-07-25 40 views
0

我正在为我的rails应用程序创建集成测试。Capybara - NameError:未初始化的常量Capybara :: TimeoutError

我正在使用的应用程序有点慢。在我的测试中,我在网站中执行了一个特定的操作(一个“保存” - 在页面结尾重新加载),并且在实际重新加载页面之前运行以下水豚动作。

我不能使用“睡眠(秒)”,因为这会冻结“重新加载”本身。

所以我想给一个尝试这种github上的想法:https://gist.github.com/metaskills/1172519

,但我得到了以下错误:

NameError: uninitialized constant Capybara::TimeoutError

谁能告诉我,为什么我得到这个错误,这是什么意思?

+1

这是没有办法,这是一个常数。你想做什么?请发布更多代码 – siegy22

+0

@RaVeN谢谢。我更新了页面 –

回答

0

正如您所发布的那样,您正试图创建一个等待ajax请求完成的方法。

但有一个更好的方式来做到这一点:

您有一个观点,它加载一个模式(遥控器,使用Ajax)。你不应该像wait_until方法那样做。或者即使不使用while true

这样做的最好办法,是设置在模态内容的独特的HTML元素:

<!-- in your modal view/partial --> 
<span id="modal"></span> 
... modal code 

然后,当您使用水豚是这样的:

find("#modal") 

find方法自动等待为所有Ajax请求完成。

查看https://www.varvet.com/blog/why-wait_until-was-removed-from-capybara/了解更多信息。

+0

谢谢RaVeN。但是如果我正在等待加载与上一页相同的页面呢?事实是,在我的脚本中,我有一个“新建”按钮,只需使用关联的ID号重新加载页面即可。Si,如果我使用“find”,它会在重新加载页面之前找到元素(这是发生了什么) –

+0

然后,您应该使用不同的dom对象来查找正在加载的页面上哪些是唯一的 – siegy22

0

您得到该错误的原因是因为在Capybara v2中删除Capybara::TimeoutError类以及#wait_until方法。正如@RaVeN的答案所述,您应该告诉水豚,期望页面上的某些内容或元素会使水豚等待它自动出现(只要您使用的是支持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驱动程序,那么等待/休眠任何事情都毫无意义,因为每个动作都是同步发生的。

+0

谢谢Tom。但是如果我正在等待加载与上一页相同的页面呢?事实是,在我的脚本中,我有一个“新建”按钮,只需使用关联的ID号重新加载页面即可。 Si,如果我使用“find”,它会在重新加载页面之前找到该元素(这是发生了什么) –

+0

如果页面真的是相同的,那么您真正可以轻松做到的只有睡眠几秒钟,或者不进行测试。页面之间是否真的没有区别,页面上没有加载指示器(您可以让水豚等到它消失),或者URL没有区别?这似乎是一个奇怪的UI有一个按钮,只是重新加载页面,没有以任何方式,形状或形式显示进度。 –

+0

谢谢汤姆。是的,它用一个不同的URL重新加载:该按钮创建一个mysql新行,并且页面重新加载,将新的ID显示为URL。问题在于,在重新加载页面之前,“睡眠”会冻结*页面。所以,当“睡眠”完成时,页面会正确地重新加载,但* find(“id = ...”)*太快,并且在“重新加载”开始之前检查页面(并且找到对象,因为已经出现在页面中)。 –

相关问题