จะตรวจสอบช่องทำเครื่องหมายใน Capybara ได้อย่างไร?


126

ฉันใช้ Rspec และ Capybara

ฉันจะเขียนขั้นตอนในการตรวจสอบได้checkboxอย่างไร? ฉันพยายามcheckตามค่า แต่ไม่พบcheckboxไฟล์. ฉันไม่แน่ใจว่าต้องทำอย่างไรเนื่องจากฉันมี ID เดียวกันและมีค่าต่างกัน

นี่คือรหัส:

 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="61" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="62" name="cityID">
 <input id="cityID" type="checkbox" style="text-align: center; opacity: 0;" value="63" name="cityID">

6
อินพุตของคุณไม่ควรมี ID เดียวกัน - ควรมีชื่อเหมือนกัน แต่คนละ ID
SamStephens

คำตอบ:


156

ฉันพบว่าสิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

# Check
find(:css, "#cityID[value='62']").set(true)

# Uncheck
find(:css, "#cityID[value='62']").set(false)

1
ดีใจที่ได้ยิน! บางทีคุณอาจทำเครื่องหมายคำตอบนี้ว่า 'ยอมรับ' และอาจโหวตเพิ่ม ... :)
Jon M

@ Jon MI มี id แปลก ๆ ที่มีวงเล็บว่างดังนั้นสำหรับตัวอย่างการตรวจสอบ ... find(:css, "#cityID[value='62']").set(true)จะทำงาน แต่find(:css, "#cityID[][value='62']").set(true)จะไม่พบและล้มเหลว ฉันจะเรียกใช้ฟังก์ชันเดียวกันโดยใช้รหัสวงเล็บว่างได้อย่างไร
TangibleDream

1
@TangibleDream เพียงเพื่อชี้แจง - คุณกำลังบอกว่าช่องทำเครื่องหมายมีรหัส "[]" หรือไม่
จอนเอ็ม

1
ฉันไม่พบวิธีทำให้สิ่งนี้ใช้งานได้กับตัวเลือก CSS เลย! ต้องมีทางหนีออกจากวงเล็บเหลี่ยม แต่หาไม่เจอ ฉันต้องใช้โปรแกรมค้นหา XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
ฉันสามารถทำเครื่องหมายคำตอบนี้ลงได้หรือไม่ ... ฉันรู้ว่ามันได้ผล แต่มันใช้งานง่ายในการมาร์กอัปคำตอบที่ไม่ได้เป็นส่วนหนึ่งของ api แบบธรรมดาที่มีให้: check ('name, id หรือ text here') (ดูคำตอบด้านล่าง)
Code Novitiate

137

จะเป็นการดีกว่าที่จะไม่สร้างองค์ประกอบหลายรายการด้วยรหัสเดียวกันดังนั้น (และไม่เพียงเท่านั้น) คุณสามารถเลือก / ยกเลิกการเลือกช่องทำเครื่องหมายด้วย elegant

check 'cityID'
uncheck 'cityID'

หากไม่สามารถหลีกเลี่ยงหลายองค์ประกอบที่มีรหัสเดียวกันและยังคงต้องทำเครื่องหมายในช่องที่มีค่าบางอย่างเขาสามารถทำได้ด้วย

find(:css, "#cityID[value='62']").set(true)
find(:css, "#cityID[value='62']").set(false)

ดูข้อมูลเพิ่มเติมเกี่ยวกับการปรับแต่งการป้อนข้อมูลคาปิบาราได้ที่นี่


2
นอกจากนี้ยังเป็นการดีกว่าที่จะไม่สร้างองค์ประกอบหลายรายการด้วยรหัสเดียวกันเนื่องจากไม่ใช่ HTML ที่ถูกต้อง นั่นไม่ควรเป็นปัญหาหากใช้ตัวช่วยแบบรางอย่างถูกต้อง
ihaztehcodez

1
ฉันต้องการเพิ่มว่าช่องทำเครื่องหมาย / ยกเลิกการเลือกยอมรับเฉพาะค่าต่อไปนี้: id ชื่อหรือองค์ประกอบป้ายกำกับที่เกี่ยวข้อง ที่นี่คุณสามารถอ่านเพิ่มเติมเกี่ยวกับมัน
Nesha Zoric

58

เมื่อทำการทดสอบคาปิบาร่าคุณจะได้รับpageวัตถุ คุณสามารถใช้เพื่อทำเครื่องหมาย / ยกเลิกการเลือกช่องทำเครื่องหมายใด ๆ ดังที่ @buruzaemon ได้กล่าวไว้แล้ว:

เพื่อค้นหาและเลือกช่องทำเครื่องหมายตามชื่อรหัสหรือข้อความป้ายกำกับ

สมมติว่าคุณมีช่องทำเครื่องหมายใน html ของคุณเช่น:

<label>  
  <input type="checkbox" value="myvalue" name="myname" id="myid">
  MyLabel
</label>

คุณสามารถตรวจสอบสิ่งนี้ได้ด้วย:

page.check('myid')
page.check('MyLabel')
page.check('myname')

ยกเลิกการเลือกก็เหมือนกันใช้page.uncheckวิธี


1
คำตอบที่มั่นคงดูเหมือนจะสะอาดกว่าคำตอบที่ยอมรับโดยใช้ตัวเลือก css (แม้ว่านั่นจะเป็นวิธีการตรวจสอบที่อยู่ใต้ฝาครอบ
ก็ตาม

1
ใช่นี่คือคำตอบที่ดีที่สุด สะอาดกว่าและเลียนแบบการกระทำของผู้ใช้อย่างใกล้ชิด ไม่ก่อให้เกิดมลพิษในรูปแบบด้วยรหัสพิเศษและทำให้การทดสอบอ่านง่าย
B Seven

ฉันยอมรับว่านี่สะอาดกว่า แม้ว่าคำตอบที่ได้รับการยอมรับจะไม่แตกต่างจากวิธีcheckการใช้งานใน Capybara มากนัก def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan

ขอบคุณและนี่คือคำตอบเดียวกันตามเอกสาร: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "ค้นหาช่องทำเครื่องหมายและทำเครื่องหมายว่าเลือกช่องทำเครื่องหมายสามารถพบได้ทางชื่อ รหัสหรือข้อความป้ายกำกับ "
Mike Vallano

26

ฉันคิดว่าคุณอาจต้องให้idองค์ประกอบแบบฟอร์มของคุณที่ไม่ซ้ำใครก่อนอื่น

แต่ในส่วนที่เกี่ยวกับ Capybara และช่องทำเครื่องหมายนั้นวิธีการตรวจสอบอินสแตนซ์ Capybara :: Node :: Actions #จะช่วยให้คุณค้นหาและทำเครื่องหมายในช่องตามชื่อรหัสหรือข้อความป้ายกำกับ


10

หากช่องนั้นเชื่อมโยงกับข้อความเช่น 'ตัวเลือก 3' ก็ทำได้ตามที่capybara 3.0.3คุณต้องการ

check 'Option 3'

1
คำตอบนี้ควรอยู่ด้านบนไม่ใช่ไวยากรณ์อายุ 8 ปี
sloneorzeszki

สำหรับสถานการณ์ที่อธิบายโดยผู้เขียนคำตอบจาก @samuel นั้นถูกต้อง
รองประธาน

7

ฉันรู้ว่านี่เป็นคำถามที่เก่ากว่า แต่ฉันได้ดำเนินการด้วยตัวเองและได้ลองทำทุกข้อข้างต้นแล้วนี่คือสิ่งที่ได้ผลสำหรับฉันในที่สุด:

find("input[type='checkbox'][value='#{cityID.id}']").set(true)

หวังว่านี่จะเป็นประโยชน์กับใครบางคน ฉันใช้ Capybara 2.4.4



1

คุณยังสามารถใช้: xpath แทน: css หากคุณมีปัญหาในการค้นหา

ค้นหา (: xpath, '//*[@id="example"]').set(true)

บน Chrome (และเบราว์เซอร์อื่น ๆ ) คุณสามารถ "ตรวจสอบองค์ประกอบ" จากนั้นคลิกขวาที่องค์ประกอบที่คุณสนใจจะมี "คัดลอก xpath" หากคุณไม่รู้ว่า xpath คืออะไรตอนนี้คุณทำ


1

คุณยังสามารถตรวจสอบว่าไม่ได้เลือกช่องทำเครื่องหมายทั้งหมดด้วยตัวอย่างนี้

ทั้งหมด ('input [type = checkbox]') แต่ละทำ | ช่องทำเครื่องหมาย | checkbox.should_not be_checked end


1

.set (true) ใช้ไม่ได้สำหรับฉันดังนั้นฉันจึงต้องโทร. คลิก:

find(...).click


(1) ฉันไม่คิดว่าclickมันเป็นคำสั่ง capybara ที่ถูกต้อง (หรืออย่างน้อยถ้าเป็นเช่นนั้นดูเหมือนว่าจะไม่อยู่ในเอกสาร) และ (2) ถ้าเป็นเช่นนั้นก็อาจจะสลับช่องทำเครื่องหมาย ไม่แน่ใจว่าเปิดหรือปิดอยู่
NotAnAmbiTurner

1

มีปัญหาบางอย่างกับช่องทำเครื่องหมายที่กำหนดเองซึ่งซ่อนอยู่หลังองค์ประกอบป้ายกำกับ allow_label_click: trueที่จำเป็น

มีการอ้างอิงถึงนี้โพสต์บล็อก ,

check 'checkbox[name]', allow_label_click: true

ขอบคุณ! สิ่งนี้ทำงานได้อย่างสมบูรณ์กับช่องทำเครื่องหมายที่กำหนดเองของ Boostrap 4 นอกจากนี้ในกรณีที่คุณต้องยกเลิกการเลือกคุณสามารถ: ยกเลิกการเลือก 'checkbox [name]', allow_label_click: true
pastullo

0
check find(".whenever input")[:id]

ฉันคิดว่าสิ่งนี้จะทำให้ capybara รอให้ผู้ฟังเหตุการณ์ใด ๆ ที่แนบมากับอินพุตนั้นซึ่งบางครั้งก็เป็นเรื่องที่เจ็บปวดหากไม่รอ .... หากอินพุตนั้นไม่มี ID ให้เลือกคุณสมบัติอื่น (ต้องมีอย่างใดอย่างหนึ่ง) ...


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