【问题标题】:Does Capybara require sleep to work?Capybara 需要睡觉才能工作吗?
【发布时间】:2013-11-01 23:28:12
【问题描述】:

显然,webpageupdates 显示,sleepwait_until 使用最新版本的 Capybara 无效。

但是,如果我在测试中添加sleep(1) 调用,我有一组测试仅适用于快速机器。也就是说,一个看起来像这样的测试:

describe "dosimeters page" do
  before do
    click_link("Dosimeter Read History", :match=>:first)
  end
...

变成

describe "dosimeters page" do
  before do
    unix_wait
    click_link("Dosimeter Read History", :match=>:first)
  end
...

我将unix_wait 定义为:

def unix_wait
  case RbConfig::CONFIG['host_os']
  when /darwin/
  when /linux-gnu/
    sleep(1)
  end
end

问题是,我有一台旧的 Ubuntu 12.04 四核笔记本电脑在 Jenkins 上运行这些测试,并且在没有 unix_wait 调用的情况下一切正常。在运行 Ubuntu 13.10 的六核台式机和 macbook pro 笔记本电脑上,测试随机失败,但如果我添加 unix_wait 调用,则测试通过。

测试失败本身表明加载失败(即,在某些运行中缺少 css 元素,但在其他运行中没有),并且当手动加载站点时,正在测试的东西实际上可以工作。

那么这里的适当操作是什么?显然,sleep 在测试期间是不允许的,wait_until 也是如此。然而,睡眠是有效的,但它对我来说似乎非常粗糙。我应该看#synchronized 吗?根据我从这些博客文章中收集到的信息,当我调用 click_link 时,它已经被调用了,并且测试仍然失败。

这里接受的协议是什么?

我应该补充一下,因为我认为这很重要:这些都是 javascript 测试。我正在使用基于 qt4(不是 qt5)构建的 capybara-webkit。我正在考虑切换到 poltergeist 或其他一些 javascript 驱动程序作为调试步骤。

【问题讨论】:

  • 你可以尝试使用webdriver进行调试,但我也有类似的问题。
  • 我在使用 ajax 时遇到了与 capybara-webkit 相同的问题。我不知道 poltergeist 是否可以解决这个问题,但值得一试。
  • 你能解释一下你看到的失败是什么吗?我不清楚“缺少 css 元素”的真正含义。
  • 我看到测试失败。有时,失败是缺少 html 或 css 元素的大型堆栈跟踪,并且由于某种原因,这会引发异常。但是,大多数情况下,查找元素或单击链接或其他任何内容的测试都会失败,因为该元素(还)不存在于页面上。当添加足够的计时代码,或者如果我执行“save_and_open_page”之类的操作时,故障就会消失
  • 在您提供的 2 个文档链接中,他们没有说 sleep 在 Capybara 中无效。事实上,这会很奇怪,因为它是一个 Ruby 函数,而不是 Capybara DSL 的一部分。

标签: javascript ruby-on-rails capybara sleep capybara-webkit


【解决方案1】:

如果您还没有这样做,在您的测试断言中,如果您检查页面上的内容,它将等待一段时间,直到该内容可用。

所以,除了添加睡眠之外,您还可以添加类似

expect(page).to have_content 'Success'

Capybara 支持 Ajax 和加载元素等,因此在检查内容时会隐式等待。

如果您需要允许加载您知道可能需要更长时间的元素,即第 3 方查询/登录,您可以更改默认等待时间

Capybara.default_wait_time = 5

【讨论】:

  • Capybara 应该 适应 Ajax,但我不完全确定它是,因为在测试期间使用 :js => true 时这些是失败的。更改default_wait_time 并没有真正帮助,但有时save_and_open_page 可以解决问题(尽管会导致窗口中断工作)。
  • Asta 是对的,问题是你没有触发 Capybara 的等待机制,因为你没有检查内容。 Asta 提到了支票have_content,而你并没有这样做。
【解决方案2】:

wait_untilsleep 的一个很好的替代品是using_wait_time,下面显示了一个示例。

using_wait_time 5 do
  page.should have_content '<content>'
end

您还可以重新加载页面,之后您可以检查您拥有的任何条件。这有时对我有用。

visit current_url

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多