Укажите элемент при совпадении нескольких элементов - PullRequest
0 голосов
/ 30 октября 2018

Как я могу с помощью капибары выбрать пункт, используя within?

У меня есть следующий HTML

<div id ="projects"> 
  ...
  <div class="card">lorem</div>
  <div class="card">ipsum</div>
</div>

И мне нужно выбрать второй div с помощью class='card'.

  within(:css, '#attachments') do
    within(:css, '.card') do
     expect(page).to have_text('ipsum')
    end
  end

Но не уверен, как это сделать.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Есть много способов выбрать этот элемент, который будет зависеть от того, что именно является структурой документа ... перед двумя элементами div (есть ли другие элементы div и т. Д.). Один из методов, который не будет зависеть от этой структуры, показан в ответе @fabersky, который должен использовать all и индексировать результаты (all('.card')[1]) - и если страница очень динамична, вы можете указать минимум на что вроде (all('.card', minimum: 2)[1]). Другой вариант - написать XPath, соответствующий только правильному элементу (как правило, предпочтительнее выбирать селекторы, которые возвращают один элемент, используя 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

0 голосов
/ 30 октября 2018

Вы можете использовать

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

Кстати, если вы не установили другой default_selector в вашем spec_helper.rb, например

Capybara.default_selector = :xpath

Вы можете просто использовать

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

, так как по умолчанию Capybara будет использовать :css как default_selector.

...