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">

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)

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


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.


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'

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.


4

Stary temat, ale inne rozwiązanie to:

check('Option 3', allow_label_click: true)


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.


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


1

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

find(...).click


(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

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ć) ...


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.