我在这里进行了一次集成测试,每次都使用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在页面上看不到。
似乎它没有等待元素在点击之前显示在页面上,但我认为将它包装在"发现"在尝试点击之前等待元素在页面上可见?
知道为什么会这样吗?
答案 0 :(得分:0)
您的问题令人困惑的是,您发布的错误消息实际上并不是您显示的代码,因为如果是错误消息将是expected to find css "div.measure#participant_consent label[for='1']" ...
。假设这只是一个复制粘贴错误/来自之前略有不同的代码版本,而您指定的行是错误实际来自的地方:
由于之前的查找/点击行有效,第三个找不到标签元素有两个潜在原因
年龄标签[for ='16']元素点击要么实际上没有发生,要么在连接显示行为的JS之前发生。你可以在它之前添加一个sleep
并查看故障是否消失来检查这一点
participant_consent find / click没有等待足够长的元素出现。 find
等待最多Capybara.default_max_wait_time
秒才能显示元素,因此如果时间足够长,您可以增加该设置,或者通过:wait
选项查找以覆盖该调用的设置< / p>
find(“div.measure#participant_consent label [for ='1']”,等待:10).click
从技术上讲,存在第三个可能的原因,但由于故障的零星性质,这种情况极不可能,这可能是页面上的JS故障。您可以通过挽救错误并暂停测试来检查这一点,以便您可以在浏览器中查看开发人员控制台是否存在任何错误。