So finden Sie ein Element, indem Sie den genauen Text des Elements in Capybara abgleichen

102

Ich habe folgende zwei Elemente in HTML

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

Ich versuche, das Element mithilfe der folgenden Capybara-Methode zu finden

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

Oben werden zwei Elemente zurückgegeben, da beide Text berlin enthalten.

Gibt es eine Möglichkeit, exakten Text in Capybara abzugleichen?

amjad
quelle
Capybara oder Nokogiri? Warum ist das beides markiert?
pguardiario

Antworten:

139

Verwenden Sie für den Wert des :textSchlüssels einen regulären Ausdruck anstelle einer Zeichenfolge :

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

Lesen Sie den Abschnitt 'Options Hash' in der Method: Capybara::Node::Finders#all Dokumentation .

PS: Bei Textübereinstimmungen wird zwischen Groß- und Kleinschreibung unterschieden. Ihr Beispielcode löst tatsächlich einen Fehler aus:

find("a", :text => "berlin")
# => Capybara::ElementNotFound:
#    Unable to find css "a" with text "berlin"
pje
quelle
13
Es ist schrecklich, dass dies die beste Antwort ist. : cry:
BM5k
Warum haben wir \ A und \ z zwischen Berlin?
Karan Verma
1
Wie kann ich einen Platzhalter in den
regulären Ausdruck einfügen
Dies hätte schriftlich erledigt werden könnenclick_link(link_text, :text => link_text)
Denken Sie daran, warum Sie
52

Abhängig davon, welche Version des Edelsteins Sie verwenden

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

kann veraltet sein. In diesem Fall müssten Sie verwenden

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

Ich bevorzuge die Verwendung have_selectormit textund exact_text: true:

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

Sie können dies auch tun:

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

Das wird für CSS finden.

Wenn Sie nur exact: trueanstelle von verwenden, exact_textwird eine Meldung angezeigt, dass diese exactOption nur für XPATH gültig ist.

CamiloVA
quelle
2
oder noch mehr können Sie verwendenfind("a", exact_text: "berlin")
Kukunin
0

Um click_link in capybara zu verwenden, müssen Sie der Methode, die es verwendet, eine weitere Eigenschaft hinzufügen.

click_link(link_name, :text => link_name)

Hier ist der Linkname der Textwert eines Links. Mit dem Schlüsselwort : text geben wir an, dass wir auf einen Link mit dem Textwert klicken möchten, der genau unserer Anforderung entspricht.

Erinnere dich, warum du begonnen hast
quelle