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选择器