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?
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#all
documentation .
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"
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)
Il suffit d'utiliser l'option exacte de Capybara :
Capybara.exact = true
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.
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