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

103

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

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

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

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

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

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

Амджад
источник
Капибара или нокогири? Почему отмечены оба?
pguardiario

Ответы:

140

Используйте регулярное выражение вместо строки для значения :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"
pje
источник
13
Ужасно, что это лучший ответ. : cry:
BM5k
почему у нас \ A и \ z между Берлином?
Каран Верма
1
как я могу добавить заполнитель в регулярное выражение
FluffyBeing
С этим можно было справиться, написавclick_link(link_text, :text => link_text)
Помните, почему вы начали
52

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

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

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

find('a', text: 'Berlin', match: :prefer_exact)
Габриэль Пампл
источник
5

Вы тоже можете это сделать:

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

Что найдете для CSS.

И использование only exact: trueвместо exact_textпокажет вам сообщение, что эта exactопция действительна только для XPATH.

Камилова
источник
3
или даже больше, можно использоватьfind("a", exact_text: "berlin")
Кукунин
4

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

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true
Павел Госьцицкий
источник
0

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

click_link(link_name, :text => link_name)

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

Помни почему ты начал
источник