【问题标题】:Capybara - NameError: uninitialized constant Capybara::TimeoutErrorCapybara - NameError: 未初始化的常量 Capybara::TimeoutError
【发布时间】:2016-07-25 13:47:10
【问题描述】:

我正在为我的 rails 应用程序创建集成测试。

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

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

所以我想尝试一下这个 github 想法:https://gist.github.com/metaskills/1172519

但我收到以下错误:

NameError: 未初始化的常量 Capybara::TimeoutError

谁能告诉我为什么会出现这个错误,这是什么意思?

【问题讨论】:

  • 这不是方法,这是一个常数。你想做什么?请发布更多代码
  • @RaVeN 谢谢。我更新了页面

标签: ruby-on-rails ruby-on-rails-3 capybara


【解决方案1】:

正如您发布的那样,您正在尝试创建一个等待 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/ 了解更多信息。

【讨论】:

  • 谢谢 RaVeN。但是,如果我正在等待加载与前一个相同的页面怎么办?事实是,在我的脚本中,我有一个“新建”按钮,它只是重新加载具有关联 ID 号的页面。 Si,如果我使用“find”,它会在重新加载页面之前找到元素(这就是发生的情况)
  • 那么你应该使用不同的 dom objecto 来查找正在加载的页面上哪个是唯一的
【解决方案2】:

您收到错误的原因是 Capybara::TimeoutError 类在 Capybara v2 中被删除,同时 #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 驱动程序,那么等待/休眠任何事情都是没有意义的,因为每个操作都是同步发生的。

【讨论】:

  • 谢谢汤姆。但是,如果我正在等待加载与前一个相同的页面怎么办?事实是,在我的脚本中,我有一个“新建”按钮,它只是重新加载具有关联 ID 号的页面。 Si,如果我使用“find”,它会在重新加载页面之前找到元素(这就是发生的情况)
  • 如果页面确实是相同的,那么您真正可以轻松地做的就是休眠几秒钟,或者不测试它。页面之间真的没有区别,页面上没有显示加载指示器(您可以让水豚等它消失),还是 URL 没有区别?有一个按钮只是重新加载页面而不以任何方式、形状或形式显示进度,这似乎是一个奇怪的 UI。
  • 谢谢汤姆。是的,它使用不同的 URL 重新加载:该按钮创建一个 mysql 新行,并且页面重新加载,将新 ID 显示为 URL。问题是“睡眠”冻结页面就在重新加载页面之前。因此,当“睡眠”完成时,页面会正确重新加载,但 find("id=...") 仍然太快并在“重新加载”开始之前检查页面(并且找到对象,因为页面中已经存在)。
  • 假设 previous_url = new_pagecurrent_path = saved_pa​​ge,即使使用 assert_not_equal(previous_url, current_path) 也会失败。这里特别是结果显示:assert_not_equal(previous_url, previous_url) -> 预期previous_url 不等于previous_url。所有这些都显示了页面如何缓慢重新加载以及 sleep 是如何无效的,因为它在重新加载之前冻结页面。
  • @LucaDanieli 你不应该使用带有 url 的 assert_not_equal 你应该使用 Capybara 提供的断言/匹配器。如果您使用的是 RSpec,则在我的答案中与 have_current_path 一致,如果不是 assert_current_path(&lt;the path you expect&gt;) 。另外,再一次,如果您使用的是支持 JS 的驱动程序,则在测试线程中休眠不会暂停应用程序线程 - 您使用的是什么驱动程序?
猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
相关资源
最近更新 更多