วิธีเลือกตัวเลือกในเมนูแบบเลื่อนลงโดยใช้ Capybara


126

ฉันกำลังพยายามเลือกรายการจากเมนูแบบเลื่อนลงโดยใช้ Capybara (2.1.0)

ฉันต้องการเลือกตามหมายเลข (หมายถึงเลือกตัวเลือกที่สองสาม ฯลฯ )

ฉัน Googled อย่างบ้าคลั่งที่พยายามทำทุกอย่าง แต่ไม่มีโชค

ฉันสามารถเลือกได้โดยใช้ค่า:

 find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click

แต่ฉันไม่ต้องการใช้วิธีนั้น b / c ค่าคือสิ่งที่จะเปลี่ยนแปลงและนั่นจะทำให้การทดสอบของฉันเปราะบาง

HTML สำหรับเมนูแบบเลื่อนลงคือ:

<td class="value">
    <select name="organizationSelect" id="organizationSelect" class="required">
     <option value="NULL">Choose...</option>
     <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option>
     <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution / test</option>
    </select>
</td>

ฉันลองสิ่งนี้ด้วย:

  option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text  
  select(option, :from => organizationSelect)

แต่ส่งผลให้เกิดข้อผิดพลาดนี้:

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)

ดังนั้นฉันจะเลือกตัวเลือกแรกสองสาม ฯลฯ จากเมนูแบบเลื่อนลง (โดยใช้ Capybara) ได้อย่างไร

คำตอบ:


130

หากคุณดูที่มาของselectวิธีการคุณจะเห็นว่าสิ่งที่ทำเมื่อคุณส่งfromคีย์นั้นมีพื้นฐานดังนี้:

find(:select, from, options).find(:option, value, options).select_option

กล่าวอีกนัยหนึ่งคือพบสิ่งที่<select>คุณสนใจจากนั้นค้นหา<option>ภายในนั้นจากนั้นเรียกselect_optionที่<option>โหนด

คุณทำสองสิ่งแรกไปได้สวยแล้วฉันจะจัดเรียงใหม่ จากนั้นคุณสามารถจัดการกับselect_optionวิธีการในตอนท้าย:

find('#organizationSelect').find(:xpath, 'option[2]').select_option

1
ขอบคุณมากแครอล! ขอบคุณจริงๆสำหรับความช่วยเหลือ! : D
Farooq

2
ต้องการเพิ่มข้อมูลอ้างอิงสำหรับผู้ที่กำลังค้นคว้าเรื่องนี้ในอนาคต: gist.github.com/zhengjia/428105
BKSpurgeon

3
ตอบโจทย์มาก! ผมอยากจะเพิ่มว่าในทางรถไฟ 5 select('option_name', from: 'select_box')คุณสามารถทำมันด้วยวิธีดังต่อไปนี้เช่นกัน: โดยที่ค่าสามารถเป็น: id ชื่อองค์ประกอบป้ายกำกับที่เกี่ยวข้อง คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ Capybara DSL และตัวเลือกที่นี่
Nesha Zoric

178

ด้วยเหตุผลบางอย่างมันไม่ได้ผลสำหรับฉัน เลยต้องใช้อย่างอื่น

select "option_name_here", :from => "organizationSelect"

ทำงานให้ฉัน


1
แปลกที่ไม่ได้ผลสำหรับฉันเพราะดูเหมือนว่าวิธีนี้จะใช้อย่างน้อย 3 ตัวเลือก แม้ว่ารหัสที่คุณแนะนำจะตรงกับรหัสตัวอย่างจากคู่มือคาปิบารา
Linus

1
มันไม่ได้ก็คือform fromนี่คือเอกสารเกี่ยวกับ select
fontno

3
บางทีควรสังเกตว่าค่าจากคือชื่อรหัสหรือข้อความป้ายกำกับ เช่น "#organizationSelect" ไม่ถูกต้อง แต่ "organizationSelect" ควรใช้งานได้
MZB

สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่วิธีแก้ปัญหาของ carols10cents ทำได้ นี่ไม่ใช่คำวิจารณ์ของคุณ ฉันพบว่ามันแปลกจริงๆที่แม้แต่ใน capybara เวอร์ชันล่าสุดการโทรบางครั้งก็ใช้งานได้และการโทรบางสายก็ไม่ได้ใช้งานแม้กระทั่งเมื่อ intution จะทำให้คุณเชื่อว่าโซลูชันหลายอย่างดูถูกต้อง มันทำให้ฉันบ้า สิ่งนี้เกี่ยวข้องกับ firefox (หรือเบราว์เซอร์ใดก็ตามที่ capybara ใช้)
chaostheory

ฉันคิดว่าสิ่งนี้จะใช้ได้ก็ต่อเมื่อชื่อตัวเลือกและค่าตัวเลือกเหมือนกัน
pixelearth

8

อีกทางเลือกหนึ่งคือเพิ่มวิธีการเช่นนี้

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end

ตัวเลือกที่เป็นประโยชน์find("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_optionซึ่งเป็นข้อความตัวเลือกที่แสดงใช้ได้ผลสำหรับฉันในขณะที่ค่าของตัวเลือกไม่ได้
codenoob

4

น่าเสียดายที่คำตอบยอดนิยมไม่ได้ผลสำหรับฉันทั้งหมด ฉันต้องเพิ่ม.select_optionท้ายคำสั่ง

select("option_name_here", from: "organizationSelect").select_option

หากselect_optionไม่มีจะไม่มีการดำเนินการเลือก


คุณโทรมาได้.select_optionอย่างไรเนื่องจากselectเมธอดส่งคืนค่าบูลีน
Ruby

4

หากต้องการเพิ่มคำตอบอื่นให้กับกอง (เพราะเห็นได้ชัดว่ามีหลายวิธีในการดำเนินการขึ้นอยู่กับการตั้งค่าของคุณ) - ฉันทำได้โดยเลือกoptionองค์ประกอบตามตัวอักษรแล้วคลิก

find(".some-selector-for-dropdown option[value='1234']").select_option

มันไม่สวยมาก แต่ใช้งานได้: /


2

ไม่มีคำตอบใดที่ใช้ได้ผลสำหรับฉันในปี 2560 กับ capybara 2.7 ฉันได้รับ "ArgumentError: จำนวนอาร์กิวเมนต์ไม่ถูกต้อง (ให้ 2 คาดว่า 0)"

แต่สิ่งนี้ทำ:

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option

0

ไม่ใช่คำตอบโดยตรง แต่คุณสามารถทำได้ (หากเซิร์ฟเวอร์ของคุณอนุญาต):

1) สร้างแบบจำลองสำหรับองค์กรของคุณ พิเศษ: การเติม HTML ของคุณจะง่ายขึ้น

2) สร้างโรงงาน (FactoryGirl) สำหรับโมเดลของคุณ

3) สร้างรายการ (create_list) กับโรงงาน

4) 'เลือก' (ตัวอย่าง) องค์กรจากรายการด้วย:

# Random select
option = Organization.all.sample 

# Select the FIRST(0) by id
option = Organization.all[0] 

# Select the SECOND(1) after some restriction
option = Organization.where(some_attr: some_value)[2]
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on... 

4
ถ้าฉันต้องสร้างโมเดลไม่มีประโยชน์ในการใช้ capybara
user1735921

มันไม่ใช่คำตอบ แต่อย่างใด นี่คือคำถามเกี่ยวกับ Capybara
Robin Daugherty

0

นี่เป็นวิธีที่รัดกุมที่สุดที่ฉันพบ (โดยใช้ capybara 3.3.0 และไดรเวอร์โครเมียม):

all('#id-of-select option')[1].select_option

จะเลือกตัวเลือกที่ 2 เพิ่มดัชนีตามต้องการ


0

ใน Capybara คุณสามารถใช้findกับxpathเท่านั้น

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

และวิธีการคลิก

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