Làm thế nào để kiểm tra một hộp kiểm trong capybara?


126

Tôi đang sử dụng Rspec và Capybara.

Làm thế nào tôi có thể viết một bước để kiểm tra checkbox? Tôi đã cố gắng checktheo giá trị nhưng nó không thể tìm thấy của tôi checkbox. Tôi không chắc phải làm gì, vì thực tế tôi có cùng một ID với các giá trị khác nhau

Đây là mã:

 <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
Đầu vào của bạn không nên có cùng ID - chúng phải có cùng tên, nhưng ID khác nhau.
SamStephens

Câu trả lời:


156

Tôi tìm thấy những điều sau đây làm việc cho tôi:

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

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

1
Vui mừng khi nghe nó! Có lẽ bạn đánh dấu câu trả lời này là 'được chấp nhận' và có thể nâng cao nó ... :)
Jon M

@Jon MI có một số id lẻ với dấu ngoặc rỗng, vì vậy, ví dụ kiểm tra ... find(:css, "#cityID[value='62']").set(true)sẽ hoạt động nhưng find(:css, "#cityID[][value='62']").set(true)sẽ không được tìm thấy và thất bại. Làm cách nào để chạy chức năng tương tự với id khung trống?
TangibleDream

1
@TangibleDream chỉ để làm rõ - bạn có nói hộp kiểm có ID là '[]' không?
Jon M

1
Tôi không thể tìm ra cách nào để thực hiện công việc này với bộ chọn CSS! Phải có một số cách để thoát khỏi dấu ngoặc vuông nhưng tôi không thể tìm thấy nó. Tôi đã phải nhờ đến một công cụ tìm XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
Tôi có thể đánh dấu câu trả lời này không ... Tôi biết nó hoạt động, nhưng bộ đếm của nó trực quan để đánh dấu một câu trả lời không phải là một phần của api đơn giản có sẵn: kiểm tra ('tên, id hoặc văn bản ở đây') (xem câu trả lời bên dưới)
Mã Novitiate

137

Tốt hơn hết là không tạo nhiều phần tử với cùng một id , để (và không chỉ cho điều đó) bạn có thể dễ dàng kiểm tra / bỏ chọn hộp kiểm một cách trang nhã

check 'cityID'
uncheck 'cityID'

Nếu một người không thể tránh được nhiều yếu tố có cùng id và vẫn cần kiểm tra hộp kiểm có giá trị nhất định , anh ta có thể làm như vậy với

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

Thông tin thêm về các thao tác nhập liệu capybara có thể được tìm thấy ở đây


2
Tốt hơn hết là không tạo nhiều phần tử với cùng một id vì đó không phải là HTML hợp lệ. Đó không phải là một vấn đề nếu sử dụng trình trợ giúp biểu mẫu đường ray đúng cách.
ihaztehcodez

1
Tôi muốn thêm rằng hộp kiểm / bỏ chọn chỉ chấp nhận các giá trị sau: id, tên hoặc thành phần nhãn liên quan. Ở đây bạn có thể đọc thêm về nó.
Nesha Zoric

58

Khi chạy thử nghiệm capybara, bạn đã có pageđối tượng. Điều này bạn có thể sử dụng để kiểm tra / bỏ chọn bất kỳ hộp kiểm nào. Như @buruzaemon đã đề cập:

để tìm và kiểm tra hộp kiểm theo tên, id hoặc văn bản nhãn.

Vì vậy, giả sử bạn có một hộp kiểm trong html của bạn như:

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

Bạn có thể kiểm tra điều này với:

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

Bỏ chọn là giống nhau chỉ sử dụng page.uncheckphương pháp.


1
câu trả lời chắc chắn, có vẻ sạch hơn câu trả lời được chấp nhận bằng cách sử dụng bộ chọn css (ngay cả khi đó là những gì phương thức kiểm tra thực hiện bên dưới trang bìa)
agmin

1
Đúng, đây là câu trả lời tốt nhất. Nó sạch hơn và nó bắt chước chặt chẽ hành động của người dùng. Nó không gây ô nhiễm biểu mẫu với thêm id và nó làm cho các bài kiểm tra dễ đọc.
B Bảy

Tôi đồng ý điều này là sạch hơn. Điều thú vị là, câu trả lời được chấp nhận không khác nhiều so với cách checkthức thực hiện phương pháp trong Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan

Cảm ơn, và đây là câu trả lời tương tự theo các tài liệu: rubydoc.info/github/jnicklas/caccobara/master/Caccobara/Node/iêu "Tìm một hộp kiểm và đánh dấu nó là đã chọn. id hoặc nhãn văn bản. "
Mike Vallano


10

Nếu hộp được liên kết với văn bản, ví dụ: 'Tùy chọn 3', thì capybara 3.0.3bạn có thể làm

check 'Option 3'

1
Câu trả lời này phải ở trên cùng, không phải là cú pháp 8 năm tuổi.
sloneorzezki

thực sự đối với kịch bản được mô tả bởi tác giả, câu trả lời từ @samuel là của chính họ
VP.

6

Tôi biết đây là một câu hỏi cũ hơn, nhưng tôi đã tự mình giải quyết vấn đề này và đã thử tất cả những điều trên, đây là điều cuối cùng đã làm cho tôi:

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

Hy vọng điều này là hữu ích cho một ai đó. Tôi đang sử dụng Capybara 2.4.4.


4

Một chủ đề cũ nhưng một giải pháp khác là:

check('Option 3', allow_label_click: true)


1

bạn cũng có thể sử dụng: xpath thay vì: css nếu bạn gặp một số vấn đề khi tìm nó.

tìm (: xpath, '//*[@id="example"[').set(true)

trên Chrome (và chắc chắn là các trình duyệt khác), bạn có thể "kiểm tra phần tử" và sau đó nhấp chuột phải vào phần tử bạn quan tâm, có 'sao chép xpath' nếu bạn không biết xpath là gì, bây giờ bạn sẽ làm gì.


1

Bạn cũng có thể kiểm tra xem tất cả các hộp kiểm tra không được kiểm tra với ví dụ này.

tất cả ('đầu vào [loại = hộp kiểm]'). mỗi do | hộp kiểm | hộp kiểm.should_not be_checked end


1

.set (true) không hoạt động với tôi nên tôi phải gọi .click:

find(...).click


(1) Tôi không nghĩ rằng clickbản thân nó là một lệnh capybara hợp lệ (hoặc ít nhất là nếu có, nó dường như không có trên các tài liệu) và (2) nếu có, nó có thể sẽ thay đổi hộp kiểm, không chắc chắn rằng nó đã bật hay tắt
NotAnAmbiTurner

1

Có một số vấn đề với hộp kiểm tùy chỉnh được ẩn đằng sau phần tử nhãn. Cần a allow_label_click: true.

Với tham chiếu đến bài viết trên blog này ,

check 'checkbox[name]', allow_label_click: true

Cảm ơn bạn! Điều này hoạt động hoàn hảo với trường hộp kiểm tùy chỉnh Boostrap 4. Ngoài ra, trong trường hợp bạn cần bỏ chọn nó, bạn có thể: bỏ chọn 'hộp kiểm [tên]', allow_label_click: true
pastullo

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

Tôi nghĩ rằng điều này sẽ khiến capybara chờ đợi bất kỳ người nghe sự kiện nào được đính kèm với đầu vào đó, đôi khi là một sự đau đớn nếu nó không chờ đợi .... Nếu đầu vào đó không có ID, hãy chọn một thuộc tính khác (phải có một) ...


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.