Come selezionare una casella di controllo in capybara?


126

Sto usando Rspec e Capybara.

Come posso scrivere un passaggio per controllare un checkbox? Ho provato checkper valore ma non riesce a trovare il mio checkbox. Non sono sicuro di cosa fare, poiché in effetti ho lo stesso ID con valori diversi

Ecco il codice:

 <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
I tuoi input non dovrebbero avere gli stessi ID: dovrebbero avere gli stessi nomi, ma ID diversi.
SamStephens,

Risposte:


156

Ho trovato il seguente ha funzionato per me:

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

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

1
Felice di sentirlo! Forse contrassegnerai questa risposta come "accettata" e forse la voterai ... :)
Jon M,

@Jon MI ha qualche id strano con parentesi vuote, quindi per l'esempio di controllo ... find(:css, "#cityID[value='62']").set(true)funzionerà ma find(:css, "#cityID[][value='62']").set(true)non verrà trovato e fallirà. Come eseguo la stessa funzione con un ID parentesi vuota?
TangibleDream,

1
@TangibleDream solo per chiarire - stai dicendo che la casella di controllo ha un ID di '[]'?
Jon M

1
Non sono riuscito a trovare un modo per farlo funzionare con il selettore CSS! Ci deve essere un modo per sfuggire alla parentesi quadra ma non sono riuscito a trovarlo. Ho dovuto ricorrere a un cercatore di XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M

3
Posso contrassegnare questa risposta verso il basso ... So che funziona, ma il suo contatore è intuitivo per contrassegnare una risposta che non fa parte della semplice API disponibile: selezionare ('nome, ID o testo qui') (vedere la risposta sotto)
Codice Noviziato

137

È meglio non creare più elementi con lo stesso ID , in modo che (e non solo per quello) sia possibile selezionare / deselezionare facilmente una casella di controllo con

check 'cityID'
uncheck 'cityID'

Se uno non può evitare più elementi con lo stesso ID e deve comunque selezionare una casella di controllo con un determinato valore , può farlo con

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

Maggiori informazioni sulle manipolazioni dell'input di capybara sono disponibili qui


2
È anche meglio non creare più elementi con lo stesso ID perché non è un codice HTML valido. Ciò non dovrebbe costituire un problema se si utilizzano correttamente le guide dei moduli.
ihaztehcodez,

1
Vorrei aggiungere che la casella di controllo / deseleziona accetta solo i seguenti valori: id, nome o elemento etichetta correlato. Qui puoi leggere di più al riguardo.
Nesha Zoric,

58

Quando si esegue il test capybara, si ottiene l' pageoggetto. Questo è possibile utilizzare per selezionare / deselezionare tutte le caselle di controllo. Come già menzionato @buruzaemon:

per trovare e selezionare una casella di controllo per nome, ID o testo dell'etichetta.

Quindi supponiamo che tu abbia una casella nel tuo html come:

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

Puoi verificarlo con:

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

Deselezionare è lo stesso solo usare il page.uncheckmetodo.


1
risposta solida, sembra più pulita della risposta accettata utilizzando i selettori css (anche se è quello che fa il metodo di controllo sotto le copertine)
agmin

1
Sì, questa è la risposta migliore. È più pulito e imita da vicino l'azione dell'utente. Non inquina il modulo con ID aggiuntivi e rende i test facili da leggere.
B Seven,

Sono d'accordo che questo è più pulito. È interessante notare che la risposta accettata non è molto diversa da come checkviene implementato il metodo in Capybara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan,

Grazie, e questa è la stessa risposta secondo i documenti: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Trova una casella di controllo e contrassegnala come selezionata. La casella di controllo può essere trovata tramite nome, testo id o etichetta ".
Mike Vallano,


10

Se la casella è associata al testo, ad esempio "Opzione 3", allora capybara 3.0.3puoi semplicemente farlo

check 'Option 3'

1
Questa risposta dovrebbe essere al vertice, non la sintassi di 8 anni.
sloneorzeszki,

in realtà per lo scenario descritto dall'autore, la risposta di @samuel è la giusta
VP.

6

So che questa è una domanda più vecchia, ma ci ho lavorato da solo, e dopo aver provato tutto quanto sopra, questo è ciò che alla fine ha funzionato per me:

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

Spero che questo sia utile a qualcuno. Sto usando Capybara 2.4.4.


4

Un vecchio argomento ma un'altra soluzione è:

check('Option 3', allow_label_click: true)


1

puoi anche usare: xpath invece di: css se hai qualche problema a trovarlo.

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

su Chrome (e sicuramente altri browser), puoi "ispezionare l'elemento" e quindi facendo clic con il tasto destro del mouse sull'elemento che ti interessa, c'è 'copia xpath' se non sai cosa fosse xpath, ora lo fai.


1

Puoi anche verificare che tutte le caselle di controllo non siano selezionate con questo esempio.

all ('input [tipo = checkbox]'). ognuno fa | checkbox | checkbox.should_not be_checked end


1

.set (true) non ha funzionato per me, quindi ho dovuto chiamare .click:

find(...).click


(1) Non credo che sia di clickper sé un comando capybara valido (o almeno se lo è, non sembra nei documenti), e (2) se lo fosse, probabilmente abiliterebbe la casella, non assicurarsi che fosse acceso o spento
NotAnAmbiTurner il

1

Si sono verificati alcuni problemi con la casella di controllo personalizzata che è nascosta dietro l'elemento etichetta. Necessario aallow_label_click: true .

Con riferimento a questo post del blog ,

check 'checkbox[name]', allow_label_click: true

Grazie! Funzionava perfettamente con un campo di controllo personalizzato Boostrap 4. Inoltre, nel caso in cui sia necessario deselezionarlo, è possibile: deselezionare 'checkbox [nome]', allow_label_click: true
pastullo

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

Penso che questo farà aspettare capybara per qualsiasi ascoltatore di eventi collegato a quell'input, che a volte è un dolore nel culo se non aspetta .... Se quell'input non ha un ID, scegli un'altra proprietà (deve essercene uno) ...


0

per selezionare la casella di controllo

  check 'name_of_checkbox'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.