Jak znaleźć element, dopasowując dokładny tekst elementu w Kapibara


103

Mam następujące dwa elementy w HTML

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

Próbuję znaleźć element, używając metody Kapibary

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

Powyższe zwróci dwa elementy, ponieważ oba zawierają tekst berlin.

Czy istnieje sposób na dopasowanie dokładnego tekstu w Kapibara?


Kapibara czy nokogiri? Dlaczego to jest oznaczone jako oba?
pguardiario

Odpowiedzi:



140

Użyj wyrażenia regularnego zamiast ciągu znaków jako wartości :textklucza:

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

Zapoznaj się z sekcją „Hash opcji” w Method: Capybara::Node::Finders#all dokumentacji .

PS: w dopasowaniach tekstowych rozróżniana jest wielkość liter. Twój przykładowy kod w rzeczywistości powoduje błąd:

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

13
To straszne, że to najlepsza odpowiedź. : płacz:
BM5k

dlaczego mamy \ A i \ z między Berlinem?
Karan Verma

1
jak mogę dodać symbol zastępczy w wyrażeniu regularnym
FluffyBeing

Można było to załatwić piszącclick_link(link_text, :text => link_text)
Remember Why You Started

52

W zależności od używanej wersji klejnotu

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

mogą być przestarzałe. W takim przypadku musisz użyć

find('a', text: 'Berlin', match: :prefer_exact)

5

Ty też możesz to zrobić:

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

To znajdzie dla CSS.

Użycie tylko exact: truezamiast exact_textspowoduje wyświetlenie wiadomości, że exactopcja jest ważna tylko dla XPATH.


3
lub nawet więcej, możesz użyćfind("a", exact_text: "berlin")
Kukunin

4

Preferuję używanie have_selectorwith texti exact_text: true:

expect(body).to have_selector 'a', text: 'Berlin', exact_text: true

0

Aby używać click_link w kapibara, musisz dodać jeszcze jedną właściwość w metodzie, która go używa.

click_link(link_name, :text => link_name)

Tutaj nazwa_linku to wartość tekstowa linku. Używając słowa kluczowego : text określamy, że chcemy kliknąć łącze o wartości tekstowej, która dokładnie odpowiada naszym wymaganiom.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.