Comment cocher une case dans capybara?


126

J'utilise Rspec et Capybara.

Comment puis-je écrire une étape pour vérifier un checkbox? J'ai essayé checkpar valeur mais il ne trouve pas mon checkbox. Je ne sais pas quoi faire, car j'ai en fait le même identifiant avec des valeurs différentes

Voici le 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
Vos entrées ne doivent pas avoir les mêmes identifiants - ils doivent avoir les mêmes noms, mais des identifiants différents.
SamStephens

Réponses:


156

J'ai trouvé que ce qui suit fonctionnait pour moi:

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

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

1
Heureux de l'entendre! Peut-être que vous marqueriez cette réponse comme `` acceptée '' et peut-être la voteriez pour ... :)
Jon M

@Jon MI a un identifiant étrange avec des crochets vides, donc pour l'exemple de vérification ... find(:css, "#cityID[value='62']").set(true)fonctionnera mais find(:css, "#cityID[][value='62']").set(true)ne sera pas trouvé et échouera. Comment exécuter la même fonction avec un identifiant de parenthèse vide?
TangibleDream

1
@TangibleDream juste pour clarifier - vous dites que la case à cocher a un ID de «[]»?
Jon M

1
Je n'ai pas du tout trouvé de moyen de faire fonctionner cela avec le sélecteur CSS! Il doit y avoir un moyen d'échapper au crochet carré mais je ne l'ai pas trouvé. J'ai dû recourir à un chercheur XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
Puis-je marquer cette réponse ... Je sais que cela fonctionne, mais il est contre-intuitif de marquer une réponse qui ne fait pas partie de l'API simple disponible: check ('name, id or text here') (voir réponse ci-dessous)
Code Noviciat

137

Il vaut mieux ne pas créer plusieurs éléments avec le même identifiant , de sorte que (et pas seulement pour cela) vous puissiez facilement cocher / décocher une case avec élégant

check 'cityID'
uncheck 'cityID'

Si l'on ne peut pas éviter plusieurs éléments avec le même identifiant et doit quand même cocher une case avec une certaine valeur , il peut le faire avec

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

Plus d'informations sur les manipulations d'entrée capybara peuvent être trouvées ici


2
Il est également préférable de ne pas créer plusieurs éléments avec le même identifiant car ce n'est pas du HTML valide. Cela ne devrait pas poser de problème si vous utilisez correctement les rails pour former des helpers.
ihaztehcodez

1
Je voudrais ajouter que la case à cocher / décocher n'accepte que les valeurs suivantes: id, nom ou élément d'étiquette associé. Ici vous pouvez en savoir plus.
Nesha Zoric

58

Lors de l'exécution du test capybara, vous obtenez l' pageobjet. Vous pouvez l'utiliser pour cocher / décocher toutes les cases. Comme @buruzaemon l'a déjà mentionné:

pour rechercher et cocher une case par nom, identifiant ou texte d'étiquette.

Supposons donc que vous ayez une case à cocher dans votre html comme:

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

Vous pouvez vérifier cela avec:

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

Décocher est la même page.uncheckméthode d' utilisation .


1
réponse solide, semble plus propre que la réponse acceptée en utilisant des sélecteurs css (même si c'est ce que fait la méthode de vérification sous les couvertures)
agmin

1
Oui, c'est la meilleure réponse. Il est plus propre et imite étroitement l'action de l'utilisateur. Il ne pollue pas le formulaire avec des identifiants supplémentaires et rend les tests faciles à lire.
B Seven

Je suis d'accord que c'est plus propre. Fait intéressant cependant, la réponse acceptée n'est pas très différente de la façon dont la checkméthode est mise en œuvre à Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan

Merci, et c'est la même réponse selon la documentation: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Trouvez une case à cocher et cochez-la comme cochée. La case à cocher peut être trouvée via nom, texte de l'identifiant ou du libellé. "
Mike Vallano


10

Si la boîte est associée à du texte, par exemple 'Option 3', alors à partir de capybara 3.0.3vous pouvez simplement faire

check 'Option 3'

1
Cette réponse doit être en haut, pas la syntaxe vieille de 8 ans.
sloneorzeszki

en fait pour le scénario décrit par l'auteur, la réponse de @samuel est la bonne
VP.

6

Je sais que c'est une question plus ancienne, mais j'y ai travaillé moi-même, et après avoir essayé tout ce qui précède, c'est ce qui a finalement fonctionné pour moi:

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

J'espère que cela est utile à quelqu'un. J'utilise Capybara 2.4.4.


4

Un vieux sujet mais une autre solution est:

check('Option 3', allow_label_click: true)


1

vous pouvez également utiliser: xpath au lieu de: css si vous rencontrez des problèmes pour le trouver.

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

sur Chrome (et sûrement d'autres navigateurs), vous pouvez "inspecter l'élément" et puis en faisant un clic droit sur l'élément qui vous intéresse, il y a "copier xpath" si vous ne savez pas ce qu'était xpath, maintenant vous le faites.


1

Vous pouvez également vérifier que toutes les cases à cocher ne sont pas cochées avec cet exemple.

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


1

.set (true) ne fonctionnait pas pour moi, j'ai donc dû appeler .click:

find(...).click


(1) Je ne pense pas que clickce soit une commande capybara valide en soi (ou du moins si c'est le cas, cela ne semble pas être sur la documentation), et (2) si c'était le cas, cela activerait probablement la case à cocher, pas assurez-vous qu'il était
activé

1

J'ai eu quelques problèmes avec la case à cocher personnalisée qui est cachée derrière l'élément d'étiquette. Besoin d'unallow_label_click: true .

En référence à cet article de blog ,

check 'checkbox[name]', allow_label_click: true

Je vous remercie! Cela fonctionnait parfaitement avec un champ de case à cocher personnalisé Boostrap 4. De plus, au cas où vous auriez besoin de la décocher, vous pouvez: décocher 'checkbox [name]', allow_label_click: true
pastullo

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

Je pense que cela fera attendre capybara pour tout écouteur d'événement attaché à cette entrée, ce qui est parfois pénible s'il n'attend pas ... Si cette entrée n'a pas d'ID, choisissez une autre propriété (il doit y en avoir un) ...


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.