Capybara'da bir onay kutusu nasıl kontrol edilir?


126

Rspec ve Capybara kullanıyorum.

A kontrol etmek için nasıl bir adım yazabilirim checkbox? Değere checkgöre denedim ama benim checkbox. Aslında farklı değerlere sahip aynı kimliğim olduğu için ne yapacağımı bilmiyorum

İşte kod:

 <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
Girişleriniz aynı kimliklere sahip olmamalıdır - aynı adlara ancak farklı kimliklere sahip olmalıdırlar.
SamStephens

Yanıtlar:


156

Aşağıdakilerin benim için çalıştığını buldum:

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

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

1
Duyduğuma sevindim! Belki de bu yanıtı 'kabul edildi' olarak işaretlersiniz ve belki ona olumlu oy verirsiniz ... :)
Jon M

@Jon MI, boş parantezlerle bazı garip kimliğe sahip, bu nedenle kontrol örneği için ... find(:css, "#cityID[value='62']").set(true)çalışacak, ancak find(:css, "#cityID[][value='62']").set(true)bulunmayacak ve başarısız olacak. Aynı işlevi boş bir parantez kimliğiyle nasıl çalıştırırım?
TangibleDream

1
@TangibleDream sadece açıklığa kavuşturmak için - onay kutusunun '[]' kimliğine sahip olduğunu mu söylüyorsunuz?
Jon M

1
Bunu CSS seçici ile çalıştırmanın bir yolunu bulamadım! Köşeli parantezden kaçmanın bir yolu olmalı ama bulamadım. Bir XPath bulucuya başvurmak zorunda kaldım:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
Bu yanıtı işaretleyebilir miyim ... Çalıştığını biliyorum, ancak mevcut basit API'nin parçası olmayan bir yanıtı işaretlemek sezgiseldir: check ('ad, kimlik veya metin burada') (aşağıdaki yanıta bakın)
Code Novitiate

137

Aynı kimliğe sahip birden fazla öğe oluşturmamak daha iyidir , böylece (ve yalnızca bunun için değil) zarif bir onay kutusunu kolayca işaretleyebilir / işaretini kaldırabilirsiniz.

check 'cityID'
uncheck 'cityID'

Aynı kimliğe sahip birden fazla öğeden kaçınılamıyorsa ve yine de belirli bir değere sahip bir onay kutusunu işaretlemesi gerekiyorsa , bunu şu şekilde yapabilir:

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

Kapibara giriş manipülasyonları hakkında daha fazla bilgi burada bulunabilir .


2
Geçerli HTML olmadığı için aynı kimliğe sahip birden fazla öğe oluşturmamak da daha iyidir. Rayların düzgün bir şekilde yardımcı olması durumunda bu bir sorun olmamalıdır.
ihaztehcodez

1
Onay kutusu / işareti kaldırmanın yalnızca şu değerleri kabul ettiğini eklemek isterim: id, ad veya ilgili etiket öğesi. Burada daha fazlasını okuyabilirsiniz.
Nesha Zoric

58

Kapibara testi çalıştırırken, pagenesneyi elde ettiniz . Bu, herhangi bir onay kutusunu işaretlemek / işaretini kaldırmak için kullanabilirsiniz. @Buruzaemon'un daha önce de bahsettiği gibi:

ada, kimliğe veya etiket metnine göre bir onay kutusu bulup işaretlemek için.

Öyleyse html'nizde aşağıdaki gibi bir onay kutusu olduğunu varsayalım:

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

Bunu şununla kontrol edebilirsiniz:

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

İşaretini kaldırmak aynı kullanım page.uncheckyöntemidir.


1
katı cevap, css seçicileri kullanan kabul edilen cevaptan daha temiz görünüyor (kontrol yönteminin kapakların altında yaptığı şey bu olsa bile)
agmin

1
Evet, bu en iyi cevap. Daha temizdir ve kullanıcının eylemini yakından taklit eder. Ekstra id'ler ile formu kirletmez ve testlerin okunmasını kolaylaştırır.
B Seven

Bunun daha temiz olduğuna katılıyorum. İlginçtir ki, kabul edilen cevap, checkyöntemin Capybara'da nasıl uygulandığından çok farklı değil . def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan

Teşekkürler ve bu, belgelere göre aynı yanıttır: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Bir onay kutusu bulun ve işaretli olarak işaretleyin. Onay kutusu ad aracılığıyla bulunabilir, kimlik veya etiket metni. "
Mike Vallano


10

Kutu metinle ilişkiliyse, örneğin 'Seçenek 3', o capybara 3.0.3zaman artık yapabilirsiniz

check 'Option 3'

1
Bu yanıt, 8 yıllık sözdizimi değil, en üstte olmalıdır.
sloneorzeszki

aslında yazar tarafından açıklanan senaryo için @samuel'in cevabı gerçek kişinin
.

6

Bunun daha eski bir soru olduğunu biliyorum, ancak bunun üzerinde kendim çalışıyorum ve yukarıdakilerin hepsini denedim, sonunda benim için işe yarayan şey buydu:

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

Umarım bu birine yardımcı olur. Capybara 2.4.4 kullanıyorum.


4

Eski bir konu ama başka bir çözüm:

check('Option 3', allow_label_click: true)


1

bulmada sorun yaşıyorsanız: css yerine: xpath de kullanabilirsiniz.

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

Chrome'da (ve kesinlikle diğer tarayıcılarda), "öğeyi inceleyebilirsiniz" ve sonra ilgilendiğiniz öğeye sağ tıklayarak, xpath'in ne olduğunu bilmiyorsanız, "xpath kopyala" vardır, şimdi yaparsınız.


1

Bu örnekle tüm onay kutularının işaretlenmediğini de kontrol edebilirsiniz.

tümü ('input [type = checkbox]'). her biri | onay kutusu | checkbox.should_not_checked end


1

.set (true) benim için işe yaramadı, bu yüzden .click'i aramak zorunda kaldım:

find(...).click


(1) clickKendi başına geçerli bir kapibara komutu olduğunu düşünmüyorum (veya en azından eğer öyleyse, belgelerde görünmüyor) ve (2) eğer öyleyse, muhtemelen onay kutusunu değiştirir, açık veya kapalı olduğundan emin
olmayın

1

Etiket öğesinin arkasına gizlenmiş özel onay kutusuyla ilgili bazı sorunlar vardı. Gerekli bir allow_label_click: true.

Bu blog gönderisine referansla ,

check 'checkbox[name]', allow_label_click: true

Teşekkür ederim! Bu, bir Boostrap 4 özel onay kutusu alanıyla mükemmel şekilde çalıştı. Ayrıca, işaretini kaldırmanız gerektiğinde, şunları yapabilirsiniz: 'onay kutusu [ad]' işaretini kaldırın, allow_label_click: true
pastullo

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

Sanırım bu, kapibara'nın bu girişe eklenmiş herhangi bir olay dinleyicisini beklemesine neden olacak, ki bu bazen beklemiyorsa baş belası oluyor ... Bu girişin bir kimliği yoksa, başka bir özellik seçin (bir tane olmalı) ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.