Как найти элемент, сопоставляя точный текст элемента в Capybara

У меня есть следующие два элемента в HTML

<a href="/berlin" >Berlin</a>
<a href="/berlin" >Berlin Germany </a>

Я пытаюсь найти элемент, используя следующий метод Capybara

find("a", :text => "berlin")

Выше возвращаются два элемента, потому что оба содержат текст berlin.

Есть ли способ сопоставить точный текст в Capybara?

Ответ 1

Используйте значение regexp вместо строки для значения ключа :text:

find("a", :text => /\ABerlin\z/)

Ознакомьтесь с разделом "Параметры хеша" в документации Method: Capybara::Node::Finders#all .

PS: текстовые совпадения чувствительны к регистру. Пример кода на самом деле вызывает ошибку:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"

Ответ 2

В зависимости от того, какую версию драгоценного камня вы используете

find('a', text: 'Berlin', exact: true)

может быть устаревшим. В этом случае вам придется использовать

find('a', text: 'Berlin', match: :prefer_exact)

Ответ 4

Для использования click_link в капибаре вам нужно добавить еще одно свойство в метод, использующий его.

click_link(link_name, :text => link_name)

Здесь link_name - это текстовое значение ссылки. Используя ключевое слово : text, мы указываем, что хотим щелкнуть ссылку, текстовое значение которой точно соответствует нашим требованиям.

Ответ 5

Я предпочитаю использовать have_selector с text и exact_text: true:

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true