使用Selenium驱动器时,Capybara测试间歇性地失败

时间:2017-05-17 13:35:38

标签: ruby-on-rails selenium testing capybara

我在这里进行了一次集成测试,每次都使用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在页面上看不到。

似乎它没有等待元素在点击之前显示在页面上,但我认为将它包装在"发现"在尝试点击之前等待元素在页面上可见?

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

您的问题令人困惑的是,您发布的错误消息实际上并不是您显示的代码,因为如果是错误消息将是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选项查找以覆盖该调用的设置< / p>

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

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