X中的RSpec Capybara元素不再存在于DOM中

时间:2015-09-23 17:29:43

标签: ruby-on-rails rspec capybara

我有一个RSpec测试:

within all('tr')[1] do expect(page).to have_content 'Title' expect(page).to have_content 'Sub Title' end

它在expect(page).to have_content 'Title'失败,出现以下错误消息:

Element at 54 no longer present in the DOM

我无法找到此错误消息的确切含义,而且此测试很有趣,有时它会通过,有时则不会。

2 个答案:

答案 0 :(得分:0)

与其他水豚探测器不同,all并不真正等待元素出现在DOM中。因此,如果您的表没有完全加载,它只是直接达到该块内的期望并且可能会失败。这可以很容易地解释为什么有时会失败,有时却会失败。

我建议在此块之前使用另一个期望,并确保该表首先完全加载。我不知道您的DOM是什么样的,但您可以尝试类似:

expect(page).to have_css('tr td', :count => 15)

所以在这一点上,在进入下一步之前,你已经等待了15行显示在DOM中。希望有所帮助。

答案 1 :(得分:0)

正如其他答案详细说明的那样,#all默认情况下不会等待元素出现,所以你可能实际上没有得到你认为的元素。而不是其他答案中的解决方案,可以通过指定以下之一来使#all等待元素出现:count,:minimum,:maximum或:between between。

within all('tr', minimum: 10)[1] do
  ...
end
例如

。这是假设测试中#within之前的操作未触发正在用其他行替换表中现有行的ajax操作。如果正在进行行替换,那么您可能会遇到使用#all的最大缺点之一 - 当使用#all时,如果返回的元素离开页面并被替换,则无法自动重新查询返回的元素,因为它们的整个查询可以'与它们一起存储(结果中没有索引)。在这种情况下,最好将代码更改为

within find(:xpath, './/tr[2]') do
  ...
end

这样,您在其中搜索的元素可以在需要时自动重新加载