Неоднозначное совпадение с использованием ny-child capybara

Я пытаюсь проверить, что сортировка работает в приложении, которое я тестирую. Я добавил 2 записи 'a' и 'b'. Я хочу проверить, что a появляется до b. Html выглядит следующим образом:

<ul id="attendee-list" class="bars">
<div>
    <li id="attendee-812202" class="bar border link attendee">
    <a class="expandable clearfix" href="#!/person/812202/">
</div>
     <div class="description">
     <p class="title">a</p>
     <p class="subtitle"></p>
     <p class="subtitle"></p>
</div>
</a>
</li>
</div>
<div>
     <li id="attendee-812206" class="bar border link attendee">
     <a class="expandable clearfix" href="#!/person/812206/">
     <div class="description">
     <p class="title">b</p>
<p class="subtitle"></p>
<p class="subtitle"></p>
</div>
</a>
</li>
</div>
</ul>

Итак, я пробовал следующее:

  find("ul.bars li:nth-child(1) a div.description p.title").should have_content("a")
  find("ul.bars li:nth-child(2) a div.description p.title").should have_content("b")

Однако я получаю неоднозначную ошибку совпадения. Кто-нибудь знает, если я делаю что-то неправильно здесь или, возможно, альтернативный метод для проверки?

Ответ 1

Проблема

Проблема заключается в li:nth-child(1). Это говорит о том, чтобы найти li, который является первым ребенком его родителя. Поскольку каждый li завернут в div, оба элемента li являются первыми детьми - то есть оба названия возвращаются с помощью селектора ul.bars li:nth-child(1) a div.description p.title (отсюда неоднозначное совпадение).

Решение 1 - Найти все

Я думаю, что самым простым решением является использование css-селектора, чтобы вернуть все заголовки, а затем использовать Capybara для проверки первого и второго.

# Get all titles
titles = page.all("ul.bars li a div.description p.title")

# Make sure that the first and second have the correct content
titles[0].should have_content("a")
titles[1].should have_content("b")

Решение 2 - Xpath

Альтернативное решение, если вы не хотите получать все (возможно, слишком много на странице), нужно попробовать xpath. Это не очень красиво, но вы можете сделать:

page.find(:xpath, '(//ul[@class="bars"]/div/li/a/div[@class="description"]/p[@class="title"])[1]').should have_content("a")
page.find(:xpath, '(//ul[@class="bars"]/div/li/a/div[@class="description"]/p[@class="title"])[2]').should have_content("b")