Jak sprawdzić checkbox w Kapibara?

126

Używam Rspec i Capybara.

Jak mogę napisać krok, aby sprawdzić checkbox? Próbowałem checkwedług wartości, ale nie mogę znaleźć mojego checkbox. Nie jestem pewien, co robić, ponieważ mam w rzeczywistości ten sam identyfikator z różnymi wartościami

Oto 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">
John Dow
źródło
6
Twoje dane wejściowe nie powinny mieć tych samych identyfikatorów - powinny mieć te same nazwy, ale różne identyfikatory.
SamStephens

Odpowiedzi:

156

Zauważyłem, że działa dla mnie:

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

# Uncheck
find(:css, "#cityID[value='62']").set(false)
Jon M
źródło
1
Miło to słyszeć! Może oznaczyłbyś tę odpowiedź jako `` zaakceptowaną '' i może ją zagłosuj ... :)
Jon M
@Jon MI ma dziwny identyfikator z pustymi nawiasami, więc dla przykładu sprawdzania ... find(:css, "#cityID[value='62']").set(true)będzie działać, ale find(:css, "#cityID[][value='62']").set(true)nie zostanie znaleziony i nie powiedzie się. Jak uruchomić tę samą funkcję z pustym identyfikatorem nawiasu?
TangibleDream
1
@TangibleDream tylko dla wyjaśnienia - czy mówisz, że pole wyboru ma identyfikator „[]”?
Jon M
1
W ogóle nie mogłem znaleźć sposobu, aby to działało z selektorem CSS! Musi być jakiś sposób na ucieczkę od nawiasu kwadratowego, ale nie mogłem go znaleźć. Musiałem skorzystać z wyszukiwarki XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M
3
Czy mogę zaznaczyć tę odpowiedź ... Wiem, że to działa, ale jest sprzeczne z intuicją, aby zaznaczyć odpowiedź, która nie jest częścią prostego dostępnego interfejsu API: sprawdź („nazwa, identyfikator lub tekst tutaj”) (patrz odpowiedź poniżej)
Code Novitiate
137

Lepiej nie tworzyć wielu elementów o tym samym identyfikatorze , aby (i nie tylko) można było łatwo zaznaczyć / odznaczyć checkbox eleganckim

check 'cityID'
uncheck 'cityID'

Jeśli nie można uniknąć wielu elementów o tym samym identyfikatorze i nadal trzeba zaznaczyć pole wyboru o określonej wartości , może to zrobić za pomocą

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

Więcej informacji na temat manipulacji przy wprowadzaniu kapibary można znaleźć tutaj

installero
źródło
2
Lepiej też nie tworzyć wielu elementów z tym samym identyfikatorem, ponieważ nie jest to prawidłowy kod HTML. Nie powinno to stanowić problemu, jeśli prawidłowo używasz railsów jako pomocników.
ihaztehcodez
1
Dodam, że pole wyboru / odznaczenie akceptuje tylko następujące wartości: id, nazwa lub powiązany element etykiety. Tutaj możesz przeczytać więcej na ten temat.
Nesha Zoric
58

Podczas testu kapibary otrzymałeś pageobiekt. Możesz tego użyć, aby zaznaczyć / odznaczyć dowolne pola wyboru. Jak już wspomniał @buruzaemon:

aby znaleźć i zaznaczyć pole wyboru według nazwy, identyfikatora lub tekstu etykiety.

Załóżmy więc, że masz pole wyboru w swoim html:

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

Możesz to sprawdzić za pomocą:

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

Odznacz to to samo, co po prostu użyj page.uncheckmetody.

p1100i
źródło
1
solidna odpowiedź, wydaje się czystsza niż zaakceptowana odpowiedź przy użyciu selektorów css (nawet jeśli tak robi metoda check pod okładkami)
agmin.
1
Tak, to najlepsza odpowiedź. Jest bardziej przejrzysty i dokładnie naśladuje działanie użytkownika. Nie zanieczyszcza formularza dodatkowymi identyfikatorami i sprawia, że ​​testy są łatwe do odczytania.
B Seven
Zgadzam się, to jest czystsze. Co ciekawe, przyjęta odpowiedź nie różni się zbytnio od tego, w jaki checksposób metoda została zaimplementowana w Kapibara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan
Dzięki, i to jest ta sama odpowiedź zgodnie z dokumentacją: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Znajdź pole wyboru i zaznacz je jako zaznaczone. Pole wyboru można znaleźć poprzez nazwę, identyfikator lub tekst etykiety ”.
Mike Vallano
10

Jeśli pole jest powiązane z tekstem, np. „Opcja 3”, capybara 3.0.3możesz po prostu zrobić

check 'Option 3'
Obromios
źródło
1
Ta odpowiedź powinna znajdować się na górze, a nie 8-letnia składnia.
sloneorzeszki
właściwie dla scenariusza opisanego przez autora odpowiedź od @samuel jest właściwa własna
wiceprezes.
6

Wiem, że to starsze pytanie, ale pracowałem nad tym osobiście i po wypróbowaniu wszystkich powyższych, oto, co w końcu zadziałało:

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

Mam nadzieję, że to komuś pomoże. Używam Kapibary 2.4.4.

Michael Cruz
źródło
4

Stary temat, ale inne rozwiązanie to:

check('Option 3', allow_label_click: true)

Samuel
źródło
1

możesz też użyć: xpath zamiast: css, jeśli masz problemy ze znalezieniem go.

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

w Chrome (i na pewno w innych przeglądarkach) możesz „sprawdzić element”, a następnie klikając prawym przyciskiem myszy element, który Cię interesuje, jest „kopiuj xpath”, jeśli nie wiesz, czym była xpath, teraz to robisz.

kulssaka
źródło
1

Możesz również sprawdzić, czy wszystkie pola wyboru nie są zaznaczone w tym przykładzie.

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

user3853159
źródło
1

.set (true) nie działało dla mnie, więc musiałem zadzwonić .click:

find(...).click

HectorPerez
źródło
(1) Nie sądzę, że clicksama w sobie jest prawidłową komendą kapibary (a przynajmniej jeśli tak jest, nie wydaje się, aby była w dokumentach) i (2) jeśli była, prawdopodobnie zmieniłaby pole wyboru, nie upewnij się, że jest włączony lub wyłączony
NotAnAmbiTurner
1

Wystąpiły problemy z niestandardowym polem wyboru, które jest ukryte za elementem etykiety. Potrzebowałem allow_label_click: true.

W nawiązaniu do tego posta na blogu ,

check 'checkbox[name]', allow_label_click: true
Vic
źródło
Dziękuję Ci! Działało to idealnie z niestandardowym polem wyboru Boostrap 4. Ponadto, jeśli musisz to odznaczyć, możesz: odznaczyć 'checkbox [nazwa]', allow_label_click: true
pastullo
0
check find(".whenever input")[:id]

Myślę, że spowoduje to, że kapibara będzie czekać na dowolny odbiornik zdarzeń dołączony do tego wejścia, co czasami jest uciążliwe, jeśli nie czeka .... Jeśli to wejście nie ma identyfikatora, wybierz inną właściwość (musi być) ...

Willian Tenfen Wazilewski
źródło
0

aby zaznaczyć pole wyboru

  check 'name_of_checkbox'
vidur punj
źródło