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.