Bagaimana cara memeriksa kotak centang di capybara?

126

Saya menggunakan Rspec dan Capybara.

Bagaimana saya bisa menulis langkah untuk memeriksa checkbox? Saya sudah mencoba checkdengan nilai tetapi tidak dapat menemukan saya checkbox. Saya tidak yakin apa yang harus dilakukan, karena pada kenyataannya saya memiliki ID yang sama dengan nilai yang berbeda

Ini kodenya:

 <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">
John Dow
sumber
6
Input Anda tidak boleh memiliki ID yang sama - mereka harus memiliki nama yang sama, tetapi ID yang berbeda.
SamStephens

Jawaban:

156

Saya menemukan yang berikut ini berfungsi untuk saya:

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

# Uncheck
find(:css, "#cityID[value='62']").set(false)
Jon M
sumber
1
Senang mendengarnya! Mungkin Anda akan menandai jawaban ini sebagai 'diterima' dan mungkin membatalkannya ... :)
Jon M
@ Jon MI memiliki beberapa id aneh dengan tanda kurung kosong jadi untuk contoh cek ... find(:css, "#cityID[value='62']").set(true)akan berfungsi tetapi find(:css, "#cityID[][value='62']").set(true)tidak akan ditemukan dan gagal. Bagaimana cara menjalankan fungsi yang sama dengan id braket kosong?
TangibleDream
1
@TangibleDream hanya untuk memperjelas - apakah Anda mengatakan bahwa kotak centang memiliki ID '[]'?
Jon M
1
Saya tidak bisa menemukan cara untuk membuat ini bekerja dengan pemilih CSS sama sekali! Pasti ada cara untuk keluar dari braket persegi tapi saya tidak bisa menemukannya. Saya harus menggunakan pencari XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M
3
Dapatkah saya menandai jawaban ini ke bawah ... Saya tahu ini berfungsi, tetapi penghitungnya intuitif untuk menandai jawaban yang bukan bagian dari api sederhana yang tersedia: centang ('nama, id atau teks di sini') (lihat jawaban di bawah)
Kode Novisiat
137

Lebih baik tidak membuat banyak elemen dengan id yang sama , sehingga (dan tidak hanya itu) Anda dapat dengan mudah menandai / menghapus centang pada kotak centang dengan elegan

check 'cityID'
uncheck 'cityID'

Jika seseorang tidak dapat menghindari beberapa elemen dengan id yang sama dan masih perlu memeriksa kotak centang dengan nilai tertentu , ia dapat melakukannya dengan

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

Informasi lebih lanjut tentang manipulasi input capybara dapat ditemukan di sini

installero
sumber
2
Lebih baik tidak membuat banyak elemen dengan id yang sama karena itu bukan HTML yang valid. Itu seharusnya tidak menjadi masalah jika menggunakan rel membentuk helper dengan benar.
ihaztehcodez
1
Saya ingin menambahkan bahwa kotak centang / hapus centang hanya menerima nilai-nilai berikut: id, nama atau elemen label terkait. Di sini Anda dapat membaca lebih lanjut tentang itu.
Nesha Zoric
58

Saat menjalankan tes capybara, Anda mendapatkan pageobjek. Ini dapat Anda gunakan untuk mencentang / menghapus centang pada kotak centang. Seperti @buruzaemon sudah disebutkan:

untuk menemukan dan memeriksa kotak centang dengan nama, id, atau teks label.

Jadi mari kita asumsikan Anda punya kotak centang di html Anda seperti:

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

Anda dapat memeriksanya dengan:

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

Hapus centang adalah metode yang sama gunakan saja page.uncheck.

p1100i
sumber
1
jawaban yang solid, tampaknya lebih bersih daripada jawaban yang diterima menggunakan penyeleksi css (bahkan jika itu yang dilakukan metode pemeriksaan di bawah selimut)
agmin
1
Yap, ini jawaban terbaik. Itu lebih bersih dan sangat mirip dengan tindakan pengguna. Itu tidak mencemari formulir dengan id ekstra dan itu membuat tes mudah dibaca.
B Seven
Saya setuju ini lebih bersih. Menariknya, jawaban yang diterima tidak jauh berbeda dari bagaimana checkmetode ini diterapkan di Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan
Terima kasih, dan ini adalah jawaban yang sama menurut dokumen: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Temukan kotak centang dan tandai sebagai dicentang. Kotak centang dapat ditemukan melalui nama, id atau label teks. "
Mike Vallano
10

Jika kotak dikaitkan dengan teks, misalnya 'Opsi 3', maka capybara 3.0.3Anda dapat melakukannya

check 'Option 3'
Obromio
sumber
1
Respons ini harus di atas, bukan sintaks yang berusia 8 tahun.
sloneorzeszki
sebenarnya untuk skenario yang dijelaskan oleh penulis, jawaban dari @samuel adalah hak sendiri
VP.
6

Saya tahu ini adalah pertanyaan yang lebih tua, tetapi saya sendiri yang telah mengerjakannya, dan setelah mencoba semua hal di atas, inilah yang akhirnya berhasil bagi saya:

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

Semoga ini bermanfaat bagi seseorang. Saya menggunakan Capybara 2.4.4.

Michael Cruz
sumber
4

Topik lama tetapi solusi lain adalah:

check('Option 3', allow_label_click: true)

Samuel
sumber
1

Anda juga dapat menggunakan: xpath bukannya: css jika Anda memiliki masalah menemukannya.

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

di Chrome (dan tentunya peramban lainnya), Anda dapat "memeriksa elemen" dan kemudian dengan mengklik kanan pada elemen yang Anda minati, ada 'salin xpath' jika Anda tidak tahu apa itu xpath, sekarang Anda lakukan.

kulssaka
sumber
1

Anda juga dapat memeriksa bahwa semua kotak centang tidak dicentang dengan contoh ini.

all ('input [type = checkbox]'). setiap do | checkbox | checkbox.should_not be_checked end

pengguna3853159
sumber
1

.set (true) tidak berfungsi untuk saya, jadi saya harus menelepon .click:

find(...).click

HectorPerez
sumber
(1) Saya tidak berpikir clickitu sendiri adalah perintah capybara yang valid (atau setidaknya jika itu, sepertinya tidak ada pada dokumen), dan (2) jika ya, itu mungkin akan mengaktifkan kotak centang, tidak memastikan itu hidup atau mati
NotAnAmbiTurner
1

Ada beberapa masalah dengan kotak centang khusus yang tersembunyi di balik elemen label. Dibutuhkan a allow_label_click: true.

Dengan mengacu pada posting blog ini ,

check 'checkbox[name]', allow_label_click: true
Vic
sumber
Terima kasih! Ini bekerja dengan baik dengan bidang kotak centang kustom Boostrap 4. Juga, jika Anda perlu menghapus centangnya, Anda dapat: hapus centang 'checkbox [name]', allow_label_click: true
pastullo
0
check find(".whenever input")[:id]

Saya pikir ini akan membuat capybara menunggu pendengar acara apa pun yang dilampirkan pada input itu, yang kadang-kadang menyebalkan jika tidak menunggu .... Jika input itu tidak memiliki ID, pilih properti lain (pasti ada satu) ...

Willian Tenfen Wazilewski
sumber
0

untuk memilih kotak centang

  check 'name_of_checkbox'
vidur punj
sumber