【问题标题】:How to use synchronize in Capybara exactly?如何在 Capybara 中准确使用同步?
【发布时间】:2013-01-13 08:07:17
【问题描述】:

如果如何使用 wait_until 非常清楚(我在通过本机 Webdriver 方法创建测试时使用过这样的方法),但不是新的 synchronize 方法(抱歉:))。我已经阅读了关于为什么不推荐使用 wait_until 的主题,我已经阅读了有关该主题的文章,我已经阅读了带有方法描述的文档,还阅读了描述存在的代码。但是我没有找到任何示例或教程如何准确地使用此方法。

请任何人提供一些我(可能还有其他人)可以看到并学习如何使用此方法的案例

以案例为例

expect(actual).to equal(expected)

我应该在哪里“放置”同步方法以仅在超时后获得负异常?

UPD:有兴趣的可以看看这个链接:

http://www.elabs.se/blog/53-why-wait_until-was-removed-from-capybara

https://github.com/jnicklas/capybara/blob/master/lib/capybara/node/base.rb#L44

【问题讨论】:

  • Capybara::RSpecMatchers 适合您的情况吗?他们会自动等待
  • 你是对的,他们应该这样做,但我的测试失败了,没有这样的元素(或类似这样的东西:))异常,没有等待指定的时间段

标签: ruby rspec capybara browser-automation


【解决方案1】:

我刚刚发现了一个需要使用#synchronize 的案例。我有一个帮助方法,它在页面上查找一个元素,如果它存在,它会单击它并返回一些在页面上更新的文本(通过 JavaScript)。在某些情况下,在找到元素并单击它之间,它可能会由于其他 JavaScript 代码而消失(并可能重新出现),并且可能引发 Selenium::WebDriver::Error::StaleElementReferenceError 异常。所以我像这样使用同步:

page.document.synchronize do
  element = first('#whatever')
  if element
    element.click
    find('#foo').text
  else
    nil
  end
end

【讨论】:

  • 实际上,即使没有同步,一切都应该没问题,因为当调用 clicktext 并发生错误时,Capybara 本身会重新加载元素。
  • @AndreyBotalov 是的。我一直在读,一遍又一遍。您不需要wait_untilsynchronizesleeps。然而,我总是遇到我绝对会做的页面,因为否则测试会失败。像expect(page).to have_css("whatever") 这样的简单断言在速度较慢的 Windows 机器上会失败,直到我将sleep 1 放在它们前面或将它们包装在synchronize 中。我知道这不应该是真的,如果我能找出原因,我会很高兴地向 Capybara 开发人员提交一个补丁。但与此同时,我们需要记录这些内容。
  • @MarkReed 实际上,在撰写之前的评论时,我对 Capybara 源代码的某些部分还不够熟悉。如果allow_reloadtrue,则重新加载发生在Capybara::Node::Element#reload。但是@allow_reload 仅由find 设置为true,而不是firstall。在 Capybara 中解决此问题的正确方法是修复 all(尽管我认为这需要一些重构)。解决 first 问题的解决方法是为 first 方法添加代码到 allow_reload
  • Simple assertions like expect(page).to have_css("whatever") fail on slower Windows machines - 也许你应该增加default_wait_time
  • 不使用sleeps 的原因是: 1. 即使机器速度很快,也要让你的代码变慢。 2.杂乱无章的代码
【解决方案2】:

查看这个可能对您有所帮助的辅助方法。发现于https://gist.github.com/10c41024510ee9f235e0

# spec/support/capybara_helpers.rb

module CapybaraHelpers
  def wait_for_whizboo
    start = Time.now
    while true
      break if [check for whizboo here, e.g. with page.evaluate_script]
      if Time.now > start + 5.seconds
        fail "Whizboo didn't happen."
      end
      sleep 0.1
    end
  end
end

RSpec.configure do |config|
  config.include CapybaraHelpers, type: :request
end

【讨论】:

  • 有一些情况可以解决这个方法,但是#synchronize方法是由Capybara作者创建的等待页面上的变化,所以我很高兴学习如何使用它跨度>
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多