Capybara"在"处理ajax,为什么在css中失败并出现错误"无法找到css"

时间:2017-08-28 09:55:58

标签: cucumber capybara capybara-webkit

我有一个这样的步骤:

Then(/^I can see the Eligible Bugs list "([^"]*)"$/) do |bugs|
  bugs_list = bugs.split(", ")
  assert page.has_css?(".eligible-bugs", :visible => true)
  within(".eligible-bugs") do
    bugs_list.each do |bug|
    assert page.has_content?(bug)
   end
  end
 end

但有时在"在(" .eligible-bugs")内"错误'无法找到css" .eligible-bugs"'

我觉得这很奇怪。 因为断言已经过去了。这意味着css是可见的。 为什么内部找不到CSS?怎么会发生。

但有时在"在(" .eligible-bugs")内"错误'无法找到css" .eligible-bugs"'

我觉得这很奇怪。 因为断言已经过去了。这意味着css是可见的。 为什么内部找不到CSS?怎么会发生。

顺便说一下,我已将最长等待时间设置为5。

   Capybara.default_max_wait_time = 5

1 个答案:

答案 0 :(得分:0)

应该发生的唯一方法是,如果页面在您运行测试时动态更改 - 有时在检查页面上正在更改的所有错误内容并且'.eligible-bugs'元素正在运行办法。测试和浏览器分别运行,因此它发生的原因和原因取决于您的页面在浏览器中的其他内容,它还取决于测试前的步骤。

另请注意,它不一定会在首次运行的has_css?within语句之间消失。如果它在within运行的代码中的任何时候消失,它可能会抛出同样的错误,因为它试图重新加载'.eligible-bugs'元素。

从问题的标题我假设您要检查的列表是搜索或过滤操作的结果。如果是,该操作是否会删除现有的“.eligible-bugs”元素,然后在一段时间后将其替换为从ajax请求返回的新元素?如果是这种情况,那么,由于您控制测试数据,您应该等待显示正确的结果计数,从而确保在检查文本之前已完成任何元素替换。你如何做到这将取决于页面的确切构成,但如果每个符合条件的bug都是'.eligible-bugs'的孩子并且有一个'.eligible-bug'类,我会写你的测试类似

Then(/^I can see the Eligible Bugs list "([^"]*)"$/) do |bugs|
  bugs_list = bugs.split(", ")
  assert_css(".eligible-bugs > .eligible_bug", count: bugs_list.size) # wait until the expected number of results have shown up

  within(".eligible-bugs") do
    bugs_list.each do |bug|
      assert_content(bug)
    end
  end
end