是否有可能找出一个元素是否出现在 Capybara 中的第二个元素之前?

Is it possible to find out if an element comes before the second element in Capybara?

我正在用 CaplybaraCucumberWebDriver 进行测试,所以我查看了两个相互重叠的元素,所以我想。

结构简单

<div id="father-parent">
    <p id="children-0">Firt element</p>
    <p id="children-1">Second element</p>
</div>

如果您要验证的是 children-0 在 children-1 之前出现,您可以使用 CSS 相邻兄弟选择器

expect(page).to have_css('#children-0 + #children-1')

如果您只想验证 children-0 是 children-1 的前一个兄弟姐妹(不一定相邻),您可以使用通用兄弟姐妹选择器

expect(page).to have_css('#children-0 ~ #children-1')

根据测试的编写方式,您还可以使用 have_sibling 匹配器:

first_child = find('#children-0')
expect(first_child).to have_sibling('#children-1')

为了测试元素位置,一些驱动程序支持 :below filter:

expect(first_child).to have_sibling('#children-1', below: first_child)

belowCapybara's global filters 之一,您也可以使用 aboveleft_ofright_of.

如果您可以进行简单的内容匹配,我刚刚添加了一个新的匹配器 spec/support/matchers/appear_before_matcher.rb:

RSpec::Matchers.define :appear_before do |later_content|
  match do |earlier_content|
    page.body.index(earlier_content) < page.body.index(later_content)
  end
end

然后像这样使用它:

expect('First element').to appear_before('Second element')