我有一个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
我无法找到此错误消息的确切含义,而且此测试很有趣,有时它会通过,有时则不会。
答案 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
这样,您在其中搜索的元素可以在需要时自动重新加载