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

103

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 Capybara suivante

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

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

Existe-t-il un moyen de faire correspondre le texte exact à Capybara?

amjad
la source
Capybara ou nokogiri? Pourquoi est-ce étiqueté à la fois?
pguardiario

Réponses:

139

Utilisez une expression régulière au lieu d'une chaîne pour la valeur de la :textclé:

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

Consultez la section «Options Hash» de la Method: Capybara::Node::Finders#all documentation .

PS: les correspondances de texte sont sensibles à la casse. Votre exemple de code génère en fait une erreur:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"
pje
la source
13
C'est terrible que ce soit la meilleure réponse. : cri:
BM5k
pourquoi avons-nous \ A et \ z entre Berlin?
Karan Verma
1
comment puis-je ajouter un espace réservé dans l'expression
régulière
Cela aurait pu être géré par écritclick_link(link_text, :text => link_text)
Remember Why You Started
52

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)
Gabriel Pumple
la source
5

Vous pouvez également le faire:

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

Cela trouvera pour CSS.

Et utiliser uniquement exact: trueau lieu de exact_textvous montrera un message indiquant que cette exactoption n'est valable que pour XPATH.

CamiloVA
la source
3
ou même plus, vous pouvez utiliserfind("a", exact_text: "berlin")
Kukunin
4

Ma préférence est d'utiliser le have_selectoravec textet exact_text: true:

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

Pour utiliser click_link dans capybara, vous devez ajouter une propriété supplémentaire dans la méthode qui l'utilise.

click_link(link_name, :text => link_name)

Ici, le link_name est la valeur textuelle d'un lien. En utilisant : mot-clé text, nous spécifions que nous voulons cliquer sur un lien dont la valeur textuelle correspond exactement à notre exigence.

Rappelez-vous pourquoi vous avez commencé
la source