多个元素匹配时指定元素
Specify the element when multiple elements matching
如何使用水豚 select 使用 within
的项目?
我有以下HTML
<div id ="projects">
...
<div class="card">lorem</div>
<div class="card">ipsum</div>
</div>
我需要 select 第二个 div 和 class='card'
。
within(:css, '#attachments') do
within(:css, '.card') do
expect(page).to have_text('ipsum')
end
end
但不确定该怎么做。
您可以使用
within all(:css, ".card")[1] do
expect(page).to have_text('ipsum')
end
顺便说一句,如果您没有在 spec_helper.rb
中设置不同的 default_selector
,例如
Capybara.default_selector = :xpath
你可以直接使用
within all(".card")[1] do
expect(page).to have_text('ipsum')
end
因为默认情况下,水豚会使用 :css
作为 default_selector
。
select 该元素有多种方法,这取决于两个 div 之前的 ...
文档结构到底是什么(是否有其他 div 等)。 @fabersky 的答案中显示了一种不依赖于该结构的方法,即使用 all
并索引到结果 (all('.card')[1]
) - 如果页面是高度动态的,您可能想要指定最小值,例如 (all('.card', minimum: 2)[1]
)。另一种选择是编写一个 XPath 以仅匹配正确的元素(通常更好的做法是更喜欢 select 或者 return 单个元素而不是使用 all
并尽可能索引到结果).
within(:css, '#attachments') do
within(:xpath, XPath.css('.card')[2]) do
expect(page).to have_text('ipsum')
end
end
在这种情况下,[2]
是 XPath 表达式的一部分(变为 .//*[contains(concat(' ', normalize-space(@class), ' '), ' card ')][2]
),因此索引从 1
开始
如何使用水豚 select 使用 within
的项目?
我有以下HTML
<div id ="projects">
...
<div class="card">lorem</div>
<div class="card">ipsum</div>
</div>
我需要 select 第二个 div 和 class='card'
。
within(:css, '#attachments') do
within(:css, '.card') do
expect(page).to have_text('ipsum')
end
end
但不确定该怎么做。
您可以使用
within all(:css, ".card")[1] do
expect(page).to have_text('ipsum')
end
顺便说一句,如果您没有在 spec_helper.rb
中设置不同的 default_selector
,例如
Capybara.default_selector = :xpath
你可以直接使用
within all(".card")[1] do
expect(page).to have_text('ipsum')
end
因为默认情况下,水豚会使用 :css
作为 default_selector
。
select 该元素有多种方法,这取决于两个 div 之前的 ...
文档结构到底是什么(是否有其他 div 等)。 @fabersky 的答案中显示了一种不依赖于该结构的方法,即使用 all
并索引到结果 (all('.card')[1]
) - 如果页面是高度动态的,您可能想要指定最小值,例如 (all('.card', minimum: 2)[1]
)。另一种选择是编写一个 XPath 以仅匹配正确的元素(通常更好的做法是更喜欢 select 或者 return 单个元素而不是使用 all
并尽可能索引到结果).
within(:css, '#attachments') do
within(:xpath, XPath.css('.card')[2]) do
expect(page).to have_text('ipsum')
end
end
在这种情况下,[2]
是 XPath 表达式的一部分(变为 .//*[contains(concat(' ', normalize-space(@class), ' '), ' card ')][2]
),因此索引从 1