涉及多项检查时如何使用Capybara Matchers?

How to use Capybara Matchers when multiple checks are involved?

在元素上使用 Capybara Matcher 很容易,只需进行一次检查,例如 expect(element).to have_selector('#selector')|| 但 在对属于列表的一部分的元素进行断言并且需要进行多次检查才能断言时,我如何实现相同的效果。 我想做类似的事情:

<products>
  <product>
  <product>
  <product>
</products>

def have_product(name,price)
 products.any? {|product| product.have_text(name) && product.have_text(price)} # pseudo code
end

我希望能够检查列表中是否存在具有给定名称和价格(两者都需要匹配)的产品。

假设您已经找到 元素并且不需要它是同一产品的最简单解决方案是

expect(products).to have_css('product', text: name).and(have_css('product', text: price))

如果需要在同一个产品元素中包含两个文本,则使用正则表达式

expect(products).to have_css('product', text: /#{product}.*#{price}/)

更高级的是创建自定义选择器类型来处理 UI 中的对象类型。

更新:

随着对原始问题的澄清,最好的解决方案可能是使用可选的过滤器块

expect(products).to have_css('product', text: name) { |node|
  node.has_field?(with: price)
}