Rspec 指定多个元素匹配时的元素

Rspec 指定多个元素匹配时的元素,rspec,capybara,Rspec,Capybara,如何使用水豚在中使用选择项目 我有下面的HTML <div id ="projects"> ... <div class="card">lorem</div> <div class="card">ipsum</div> </div> 但是不知道怎么做。您可以使用 within all(:css, ".card")[1] do expect(page).to have_text('ipsum') end

如何使用水豚在中使用
选择项目

我有下面的HTML

<div id ="projects"> 
  ...
  <div class="card">lorem</div>
  <div class="card">ipsum</div>
</div>
但是不知道怎么做。

您可以使用

within all(:css, ".card")[1] do
  expect(page).to have_text('ipsum')
end
顺便说一下,如果您没有在
spec\u helper.rb
中设置不同的
default\u选择器
,如

Capybara.default_selector = :xpath
你可以用

within all(".card")[1] do
 expect(page).to have_text('ipsum')
end
由于默认情况下,水豚将使用
:css
作为
默认选择器
,您可以使用

within all(:css, ".card")[1] do
  expect(page).to have_text('ipsum')
end
顺便说一下,如果您没有在
spec\u helper.rb
中设置不同的
default\u选择器
,如

Capybara.default_selector = :xpath
你可以用

within all(".card")[1] do
 expect(page).to have_text('ipsum')
end

由于默认情况下,Capybara将使用
:css
作为
默认选择器

,因此有许多方法可以选择该元素,这取决于两个div之前的
文档结构(是否有其他div等)。@fabersky的回答中显示了一种不依赖于该结构的方法,即使用
all
并将结果编入索引(
all('.card')[1]
)-如果页面高度动态,您可能希望在该页面上指定一个最小值,如(
all('.card',minimum:2)[1]
)。另一种选择是编写只匹配正确元素的XPath(通常更好的做法是选择返回单个元素的选择器,而不是尽可能使用
all
和索引到结果中)


在本例中,
[2]
是XPath表达式的一部分(成为
/*[contains(concat('',normalize space(@class),'','card')][2]
),因此索引确实从1开始,有很多方法选择该元素,这取决于两个div之前的
..
文档结构(是否还有其他div等)。@fabersky的回答中显示了一种不依赖于该结构的方法,即使用
all
并将结果编入索引(
all('.card')[1]
)-如果页面是高度动态的,您可能希望在该页面上指定一个最小值,如(
all('.card',minimum:2)[1]
)。另一种选择是编写XPath以仅匹配正确的元素(通常更好的做法是选择返回单个元素的选择器,而不是尽可能使用
all
和索引到结果中)


在本例中,
[2]
是XPath表达式的一部分(成为
/*[contains(concat('',normalize space(@class),'','card')][2]
),因此索引从1开始。

Capybara索引从1开始。如果您编写的自定义XPath的索引从1开始(根据XPath语言的定义)但在本例中,您将索引到results对象,该对象的行为类似于ruby数组,因此索引从0开始。谢谢,我最终在(page.find_all(:css,.card')[0])中执行了
但是您的代码更干净了一点。@Sig如果您需要第一个元素,那么您应该使用
first(…)
而不是
查找所有(…)[0]
——或者使用我的回答中所示的特定XPath选择器。Capybara索引不是从1开始的。如果您编写的自定义XPath的索引从1开始(根据XPath语言的定义)但在本例中,您将索引到results对象,该对象的行为类似于ruby数组,因此索引从0开始。谢谢,我最终在(page.find_all(:css,.card')[0])中执行了
,执行…
但您的代码有点干净。@Sig如果您需要第一个元素,那么您应该使用
first(…)
而不是
find_all(…)[0]
-或者使用我的答案中所示的特定XPath选择器