Как найти элемент, сопоставив точный текст элемента в 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"

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")
Кукунин


0

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

click_link(link_name, :text => link_name)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.