วิธีค้นหาองค์ประกอบโดยการจับคู่ข้อความขององค์ประกอบใน Capybara


103

ฉันมีสององค์ประกอบต่อไปนี้ใน HTML

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

ฉันกำลังพยายามค้นหาองค์ประกอบโดยใช้วิธี Capybara ต่อไปนี้

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

ด้านบนจะแสดงสององค์ประกอบเนื่องจากทั้งสองมีข้อความเบอร์ลิน

มีวิธีจับคู่ข้อความใน Capybara หรือไม่?


Capybara หรือ nokogiri? ทำไมถึงติดแท็กทั้งคู่
pguardiario

คำตอบ:



139

ใช้ regexp แทนสตริงสำหรับค่าของ:textคีย์:

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

ตรวจสอบส่วน 'ตัวเลือกแฮ' ของเอกสารMethod: Capybara::Node::Finders#all

PS: การจับคู่ข้อความต้องตรงตามตัวพิมพ์เล็กและใหญ่ โค้ดตัวอย่างของคุณทำให้เกิดข้อผิดพลาดขึ้นจริง:

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

13
มันแย่มากที่นี่คือคำตอบที่ดีที่สุด : cry:
BM5k

ทำไมเราถึงมี \ A และ \ z ระหว่างเบอร์ลิน
Karan Verma

1
ฉันจะเพิ่มตัวยึดตำแหน่งใน regex ได้อย่างไร
FluffyBeing

สิ่งนี้สามารถจัดการได้ด้วยการเขียนclick_link(link_text, :text => link_text)
จำไว้ว่าทำไมคุณเริ่มเมื่อ

52

ขึ้นอยู่กับรุ่นของอัญมณีที่คุณใช้

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

อาจเลิกใช้งาน ซึ่งในกรณีนี้คุณจะต้องใช้

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

5

คุณสามารถทำได้เช่นกัน:

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

ที่จะพบสำหรับ CSS

และการใช้เพียงอย่างเดียวexact: trueแทนexact_textจะแสดงข้อความให้คุณเห็นว่าexactตัวเลือกนี้ใช้ได้เฉพาะกับ XPATH เท่านั้น


3
หรือมากกว่านั้นคุณสามารถใช้ได้find("a", exact_text: "berlin")
Kukunin


0

สำหรับการใช้ click_link ใน capybara คุณต้องเพิ่มอีกหนึ่งคุณสมบัติในวิธีการใช้งาน

click_link(link_name, :text => link_name)

ที่นี่link_nameคือค่าข้อความของลิงก์ การใช้:คำหลักข้อความเรากำลังระบุว่าเราต้องการคลิกลิงก์ที่มีค่าข้อความที่ตรงกับความต้องการของเราทุกประการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.