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">
John Dow
quelle
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)
Jon M.
quelle
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

installero
quelle
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.

p1100i
quelle
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'
Obromios
quelle
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.

Michael Cruz
quelle
4

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

check('Option 3', allow_label_click: true)

Samuel
quelle
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.

Kulssaka
quelle
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

user3853159
quelle
1

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

find(...).click

HectorPerez
quelle
(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) ...

Willian Tenfen Wazilewski
quelle
0

um das Kontrollkästchen zu aktivieren

  check 'name_of_checkbox'
vidur punj
quelle
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
Vic
quelle