web-dev-qa-db-fra.com

Comment trouver un élément en faisant correspondre le texte exact de l'élément dans Capybara

J'ai deux éléments suivants en HTML 

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

J'essaie de trouver l'élément en utilisant la méthode suivante de Capybara

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

Ci-dessus retournera deux éléments, car les deux contiennent du texte berlin. 

Y a-t-il un moyen de faire correspondre le texte exact dans Capybara?

87
amjad

Utilisez une expression rationnelle au lieu d'une chaîne pour la valeur de la clé :text:

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

Consultez la section "Options de hachage" de la Method: Capybara::Node::Finders#alldocumentation .

PS: les correspondances de texte sont sensibles à la casse. Votre exemple de code soulève en réalité une erreur:

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

Selon la version de la gemme que vous utilisez 

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

peut être obsolète. Dans ce cas, vous devrez utiliser 

find('a', text: 'Berlin', match: :prefer_exact)
43
Gabriel Pumple

Il suffit d'utiliser l'option exacte de Capybara :

Capybara.exact = true
3
John W

Pour utiliser click_link dans capybara, vous devez ajouter une propriété supplémentaire à la méthode l’utilisant.

click_link(link_name, :text => link_name)

Ici, le nom_du_lien est la valeur textuelle d'un lien. En utilisant: text mot clé, nous spécifions que nous voulons cliquer sur un lien ayant la valeur de texte qui correspond exactement à notre exigence.

0

Ma préférence est d'utiliser le have_selector avec text et exact_text: true:

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true
0
Paweł Gościcki