【问题标题】:Capybara test intermittently failing when using Selenium driver使用 Selenium 驱动程序时 Capybara 测试间歇性失败
【发布时间】:2017-05-17 13:35:37
【问题描述】:

我在这里有一个集成测试,每次都使用 poltergeist 驱动程序完美通过,但是当我使用 Selenium 运行这个测试时,它平均通过 3 次,失败 1 次。

def fill_in_inclusion_criteria
  find("div.measure#age label[for='16']").click
  find("div.measure#substance_use_met label[for='1']").click
  find("div.measure#participant_consent label[for='1']").click
  click_link("Next")
end

当它失败时,我返回的错误是这样的

expected to find css "div.measure#participant_consent" but there were no matches. Also found "", which matched the selector but not all filters.

点击div.measure#age label[for='16']时会出现参与者同意按钮,因此它依赖于Javascript。我大部分时间都在 Firefox 中看到这种情况,但是当它出错时,该 div 在页面上不可见。

似乎在点击之前它没有等待元素显示在页面上,但我认为将它包装在“查找”中会等待元素在页面上可见,然后再尝试点击它?

知道为什么会发生这种情况吗?

【问题讨论】:

    标签: ruby-on-rails selenium testing capybara


    【解决方案1】:

    与您的问题有关的一件令人困惑的事情是,您发布的错误消息实际上并不是针对您显示的代码,因为如果是错误消息,则会是 expected to find css "div.measure#participant_consent label[for='1']" ... 。假设这只是一个复制粘贴错误/来自以前稍微不同的代码版本,并且您指定的行是错误的实际来源:

    由于前面的查找/单击行正常工作,第三个找不到标签元素的潜在原因有两个

    1. 年龄标签[for='16'] 元素点击要么实际上没有发生,要么在附加启用显示行为的 JS 之前发生。您可以通过在它之前添加 sleep 几秒钟并查看故障是否消失来检查这一点

    2. participant_consent find/click 等待元素出现的时间不够长。 find 最多等待 Capybara.default_max_wait_time 秒以显示元素,因此如果时间足够长,您可以增加该设置,或传递 :wait 选项来查找以覆盖该调用的设置

      find("div.measure#participant_consent label[for='1']", 等待:10).click

    从技术上讲,还有第三个潜在原因,但由于故障的零星性质,这极不可能,这将是页面上的 JS 故障。您可以通过抢救错误并暂停测试来检查这一点,以便您可以在浏览器中查看开发人员控制台是否有任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多