Cómo encontrar un elemento haciendo coincidir el texto exacto del elemento en Capybara

102

Tengo los siguientes dos elementos en HTML

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

Estoy tratando de encontrar el elemento usando el siguiente método de Capybara

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

Arriba se devolverán dos elementos porque ambos contienen texto berlin.

¿Hay alguna forma de hacer coincidir el texto exacto en Capybara?

amjad
fuente
¿Carpincho o nokogiri? ¿Por qué está etiquetado ambos?
pguardiario

Respuestas:

139

Use una expresión regular en lugar de una cadena para el valor de la :textclave:

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

Consulte la sección 'Opciones hash' de la Method: Capybara::Node::Finders#all documentación .

PD: las coincidencias de texto distinguen entre mayúsculas y minúsculas. Su código de ejemplo en realidad genera un error:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"
pje
fuente
13
Es terrible que esta sea la mejor respuesta. : cry:
BM5k
¿Por qué tenemos \ A y \ z entre Berlín?
Karan Verma
1
¿Cómo puedo agregar un marcador de posición en la expresión regular?
FluffyBeing
Esto podría haberse manejado escribiendoclick_link(link_text, :text => link_text)
recuerde por qué comenzó el
52

Dependiendo de la versión de la gema que estés usando

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

puede estar en desuso. En cuyo caso tendrías que usar

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

Mi preferencia es usar have_selectorcon texty exact_text: true:

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

Tú también puedes hacerlo:

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

Eso encontrará para CSS.

Y usar solo en exact: truelugar de exact_textle mostrará un mensaje de que la exactopción solo es válida para XPATH.

CamiloVA
fuente
2
o incluso más, puede usarfind("a", exact_text: "berlin")
Kukunin
0

Para usar click_link en carpincho, debe agregar una propiedad más en el método que lo usa.

click_link(link_name, :text => link_name)

Aquí, link_name es el valor de texto de un enlace. Usando : palabra clave de texto , estamos especificando que queremos hacer clic en un enlace que tiene el valor de texto que coincide exactamente con nuestro requisito.

Recuerda por qué empezaste
fuente