Capibara'da öğenin tam metnini eşleştirerek bir öğe nasıl bulunur?


103

HTML'de aşağıdaki iki element var

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

Capybara yöntemini kullanarak elementi bulmaya çalışıyorum

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

Her ikisi de metin berlin içerdiğinden, yukarıdaki iki öğe döndürür.

Capybara'daki metni tam olarak eşleştirmenin bir yolu var mı?


Kapibara mı yoksa nokogiri mi? Bu neden her ikisi de etiketlendi?
— pguardiario

Yanıtlar:



140

:textAnahtarın değeri için bir dize yerine bir normal ifade kullanın :

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

Method: Capybara::Node::Finders#all Belgelerin 'Seçenekler Karması' bölümüne bakın .

Not: metin eşleşmeleri büyük / küçük harfe duyarlıdır. Örnek kodunuz aslında bir hataya neden oluyor:

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

13
En iyi yanıtın bu olması korkunç. : ağla:
— BM5k

neden Berlin arasında \ A ve \ z var?
— Karan Verma

1
normal
— ifadede

Bu, yazarak çözülebilirdiclick_link(link_text, :text => link_text)
— Hatırlayın

52

Hangi mücevher sürümünü kullandığınıza bağlı olarak

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

kullanımdan kaldırılabilir. Bu durumda kullanmanız gerekecek

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

5

Bunu da yapabilirsiniz:

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

Bu CSS için bulacaktır.

Ve exact: truebunun yerine yalnızca kullanmak exact_textsize exactseçeneğin yalnızca XPATH için geçerli olduğu bir mesaj gösterecektir .


3
veya daha fazlasını kullanabilirsinizfind("a", exact_text: "berlin")
— Kukunin

4

Benim tercih kullanmaktır have_selectorile textve exact_text: true:

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

0

Capibara'da click_link kullanmak için, onu kullanan yönteme bir özellik daha eklemeniz gerekir.

click_link(link_name, :text => link_name)

İşte link_name bir bağlantının metni değeridir. Metin anahtar sözcüğünü kullanarak , gereksinimimizle tam olarak eşleşen metin değerine sahip bir bağlantıya tıklamak istediğimizi belirtiyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.