Wie aktiviere ich ein Kontrollkästchen in Capybara?


126

Ich benutze Rspec und Capybara.

Wie kann ich einen Schritt schreiben, um a zu überprüfen checkbox? Ich habe es checknach Wert versucht , aber es kann meinen nicht finden checkbox. Ich bin mir nicht sicher, was ich tun soll, da ich tatsächlich dieselbe ID mit unterschiedlichen Werten habe

Hier ist der Code:

 <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
Ihre Eingaben sollten nicht dieselben IDs haben - sie sollten dieselben Namen, aber unterschiedliche IDs haben.
SamStephens

Antworten:


156

Ich fand, dass Folgendes für mich funktioniert hat:

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

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

1
Froh das zu hören! Vielleicht würdest du diese Antwort als "akzeptiert" markieren und sie vielleicht verbessern ... :)
Jon M

@ Jon MI haben eine ungerade ID mit leeren Klammern, so dass für das Prüfbeispiel ... find(:css, "#cityID[value='62']").set(true)funktioniert, aber find(:css, "#cityID[][value='62']").set(true)nicht gefunden wird und fehlschlägt. Wie führe ich dieselbe Funktion mit einer leeren Klammer-ID aus?
TangibleDream

1
@TangibleDream nur zur Verdeutlichung - sagen Sie, dass das Kontrollkästchen die ID '[]' hat?
Jon M

1
Ich konnte überhaupt keinen Weg finden, dies mit dem CSS-Selektor zum Laufen zu bringen! Es muss einen Weg geben, der eckigen Klammer zu entkommen, aber ich konnte ihn nicht finden. Ich musste auf einen XPath-Finder zurückgreifen:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
Kann ich diese Antwort notieren ... Ich weiß, dass sie funktioniert, aber es ist nicht intuitiv, eine Antwort zu markieren, die nicht Teil der verfügbaren einfachen API ist: check ('Name, ID oder Text hier') (siehe Antwort unten)
Code Novitiate

137

Es ist besser, nicht mehrere Elemente mit derselben ID zu erstellen , damit Sie (und nicht nur dafür) ein Kontrollkästchen mit elegant einfach aktivieren / deaktivieren können

check 'cityID'
uncheck 'cityID'

Wenn man nicht mehrere Elemente mit derselben ID vermeiden kann und dennoch ein Kontrollkästchen mit einem bestimmten Wert aktivieren muss , kann man dies mit tun

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

Weitere Informationen zu Eingabemanipulationen bei Capybara finden Sie hier


2
Es ist auch besser, nicht mehrere Elemente mit derselben ID zu erstellen, da es sich nicht um gültiges HTML handelt. Dies sollte kein Problem sein, wenn die Schienen ordnungsgemäß verwendet werden.
Ihaztehcodez

1
Ich möchte hinzufügen, dass das Kontrollkästchen / Deaktivieren nur die folgenden Werte akzeptiert: ID, Name oder zugehöriges Beschriftungselement. Hier können Sie mehr darüber lesen.
Nesha Zoric

58

Beim Ausführen des Capybara-Tests haben Sie das pageObjekt erhalten. Hiermit können Sie alle Kontrollkästchen aktivieren / deaktivieren. Wie bereits erwähnt @buruzaemon:

um ein Kontrollkästchen nach Name, ID oder Beschriftungstext zu finden und zu aktivieren.

Nehmen wir also an, Sie haben ein Kontrollkästchen in Ihrem HTML-Code wie folgt:

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

Sie können dies überprüfen mit:

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

Das Deaktivieren ist die gleiche page.uncheckMethode.


1
solide Antwort, scheint sauberer als die akzeptierte Antwort mit CSS-Selektoren (auch wenn dies die
Prüfmethode

1
Ja, das ist die beste Antwort. Es ist sauberer und ahmt die Benutzeraktion genau nach. Das Formular wird nicht mit zusätzlichen IDs verschmutzt, und die Tests sind leicht zu lesen.
B Seven

Ich bin damit einverstanden, dass dies sauberer ist. Interessanterweise unterscheidet sich die akzeptierte Antwort nicht wesentlich von der checkImplementierung der Methode in Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
Bigtunacan

Vielen Dank, und dies ist die gleiche Antwort gemäß den Dokumenten: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Suchen Sie ein Kontrollkästchen und markieren Sie es als aktiviert . Das Kontrollkästchen finden Sie über den Namen. ID oder Beschriftungstext. "
Mike Vallano


10

Wenn das Feld mit Text verknüpft ist, z. B. 'Option 3', capybara 3.0.3können Sie dies ab sofort tun

check 'Option 3'

1
Diese Antwort sollte ganz oben stehen, nicht die 8 Jahre alte Syntax.
Sloneorzeszki

Für das vom Autor beschriebene Szenario ist die Antwort von @samuel die richtige
VP.

6

Ich weiß, dass dies eine ältere Frage ist, aber ich habe sie selbst durchgearbeitet, und nachdem ich alle oben genannten Fragen ausprobiert habe, hat dies letztendlich für mich funktioniert:

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

Hoffe das ist hilfreich für jemanden. Ich benutze Capybara 2.4.4.


4

Ein altes Thema, aber eine andere Lösung ist:

check('Option 3', allow_label_click: true)


1

Sie können auch: xpath anstelle von: css verwenden, wenn Sie Probleme beim Auffinden haben.

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

In Chrome (und sicherlich auch in anderen Browsern) können Sie das Element "inspizieren". Wenn Sie dann mit der rechten Maustaste auf das gewünschte Element klicken, wird "xpath kopieren" angezeigt. Wenn Sie nicht wissen, was xpath war, tun Sie dies jetzt.


1

Sie können in diesem Beispiel auch überprüfen, ob nicht alle Kontrollkästchen aktiviert sind.

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


1

.set (true) hat bei mir nicht funktioniert, daher musste ich .click anrufen:

find(...).click


(1) Ich denke nicht, dass es sich clickallein um einen gültigen Capybara-Befehl handelt (oder zumindest, wenn dies der Fall ist, scheint er nicht in den Dokumenten enthalten zu sein), und (2) wenn dies der Fall wäre, würde das Kontrollkästchen wahrscheinlich umgeschaltet. nicht sicher, ob es
ein-

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

Ich denke, dies lässt Capybara auf jeden Ereignis-Listener warten, der an diese Eingabe angehängt ist. Dies ist manchmal ein Problem, wenn es nicht wartet. Wenn diese Eingabe keine ID hat, wählen Sie eine andere Eigenschaft (es muss einen geben) ...



0

Hatte einige Probleme mit dem benutzerdefinierten Kontrollkästchen, das hinter dem Beschriftungselement versteckt ist. Benötigt a allow_label_click: true.

In Bezug auf diesen Blog-Beitrag ,

check 'checkbox[name]', allow_label_click: true
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.