Como marcar uma caixa de seleção na capivara?

126

Estou usando Rspec e Capivara.

Como posso escrever uma etapa para verificar a checkbox? Eu tentei checkpelo valor, mas ele não pode encontrar o meu checkbox. Não tenho certeza do que fazer, pois na verdade tenho o mesmo ID com valores diferentes

Aqui está o código:

 <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
fonte
6
Suas entradas não devem ter os mesmos IDs - eles devem ter os mesmos nomes, mas IDs diferentes.
precisa saber é o seguinte

Respostas:

156

Eu encontrei o seguinte funcionou para mim:

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

# Uncheck
find(:css, "#cityID[value='62']").set(false)
Jon M
fonte
1
Fico feliz em ouvir isso! Talvez você marcar esta resposta como 'aceito' e talvez upvote-lo ... :)
Jon M
@ Jon MI tem algum ID estranho com colchetes vazios, portanto, para o exemplo de verificação ... find(:css, "#cityID[value='62']").set(true)funcionará, mas find(:css, "#cityID[][value='62']").set(true)não será encontrado e falhará. Como executo a mesma função com um ID de colchete vazio?
TangibleDream
1
@TangibleDream apenas para esclarecer - você está dizendo que a caixa de seleção tem um ID de '[]'?
Jon M
1
Não consegui encontrar uma maneira de fazer isso funcionar com o seletor de CSS! Deve haver alguma maneira de escapar do colchete, mas não consegui encontrá-lo. Eu tive que recorrer a um localizador XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M
3
Posso marcar esta resposta ... Eu sei que funciona, mas é contra-intuitivo marcar uma resposta que não faça parte da API simples disponível: check ('nome, ID ou texto aqui') (veja a resposta abaixo)
Code Novitiate
137

É melhor não criar vários elementos com o mesmo ID , para que (e não apenas para isso) você possa marcar / desmarcar facilmente uma caixa de seleção com

check 'cityID'
uncheck 'cityID'

Se alguém não puder evitar vários elementos com o mesmo ID e ainda precisar marcar uma caixa de seleção com determinado valor , poderá fazê-lo com

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

Mais informações sobre manipulações de entrada de capivara podem ser encontradas aqui

installero
fonte
2
Também é melhor não criar vários elementos com o mesmo ID porque não é HTML válido. Isso não deve ser um problema se o uso correto dos trilhos for útil.
Ihaztehcodez
1
Gostaria de acrescentar que a caixa de seleção / desmarcar somente aceita os seguintes valores: id, nome ou elemento de rótulo relacionado. Aqui você pode ler mais sobre isso.
Nesha Zoric
58

Ao executar o teste da capivara, você obteve o pageobjeto. Isso pode ser usado para marcar / desmarcar todas as caixas de seleção. Como o @buruzaemon já mencionou:

para encontrar e marcar uma caixa de seleção por nome, ID ou texto do rótulo.

Então, vamos supor que você tenha uma caixa de seleção em seu html como:

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

Você pode verificar isso com:

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

Desmarcar é o mesmo page.uncheckmétodo apenas usar .

p1100i
fonte
1
resposta sólida, parece mais limpo do que a resposta aceita usando seletores CSS (mesmo se é isso que o método de verificação faz embaixo das cobertas)
Agmin
1
Sim, esta é a melhor resposta. É mais limpo e imita de perto a ação do usuário. Ele não polui o formulário com IDs extras e facilita a leitura dos testes.
B Seven
Eu concordo que isso é mais limpo. Curiosamente, a resposta aceita não é muito diferente de como o checkmétodo é implementado na Capivara. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan
Obrigado, e esta é a mesma resposta de acordo com os documentos: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Encontre uma caixa de seleção e marque-a como marcada. A caixa de seleção pode ser encontrada via nome, ID ou texto da etiqueta ".
Mike Vallano
10

Se a caixa estiver associada ao texto, por exemplo, 'Opção 3', então capybara 3.0.3você pode simplesmente fazer

check 'Option 3'
Obromios
fonte
1
Essa resposta deve estar no topo, não na sintaxe de 8 anos.
Sloneorzeszki 19/03/19
na verdade, para o cenário descrito pelo autor, a resposta de @samuel é a correta
VP.
6

Sei que essa é uma pergunta mais antiga, mas eu mesma já resolvi isso e, depois de tentar todas as opções acima, foi isso que finalmente funcionou para mim:

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

Espero que isto seja útil para alguém. Estou usando a Capivara 2.4.4.

Michael Cruz
fonte
4

Um tópico antigo, mas outra solução é:

check('Option 3', allow_label_click: true)

Samuel
fonte
1

você também pode usar: xpath em vez de: css se tiver algum problema para encontrá-lo.

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

no Chrome (e certamente em outros navegadores), você pode "inspecionar o elemento" e, em seguida, clicando com o botão direito do mouse no elemento de seu interesse, existe 'copy xpath' se você não sabe o que era xpath, agora sabe.

Kulssaka
fonte
1

Você também pode verificar se todas as caixas de seleção não estão marcadas com este exemplo.

all ('input [type = checkbox]'). cada um faz | checkbox | checkbox.should_not be_checked end

user3853159
fonte
1

.set (true) não funcionou para mim, então tive que ligar para .click:

find(...).click

HectorPerez
fonte
(1) não acho que clickseja um comando válido da capivara (ou pelo menos, se estiver, não parece estar nos documentos) e (2) se fosse, provavelmente alternaria a caixa de seleção, não se certificar de que estava ligado ou desligado
NotAnAmbiTurner
1

Tive alguns problemas com a caixa de seleção personalizada, oculta por trás do elemento label. Necessário a allow_label_click: true.

Com referência a esta postagem no blog ,

check 'checkbox[name]', allow_label_click: true
Vic
fonte
Obrigado! Isso funcionou perfeitamente com um campo de caixa de seleção personalizado do Boostrap 4. Além disso, caso precise desmarcá-lo, você pode: desmarcar 'checkbox [name]', allow_label_click: true
pastullo
0
check find(".whenever input")[:id]

Eu acho que isso fará a capivara esperar por qualquer ouvinte de evento anexado a essa entrada, o que às vezes é um pé no saco se não esperar .... Se essa entrada não tiver um ID, escolha outra propriedade (deve haver um) ...

Willian Tenfen Wazilewski
fonte
0

para marcar a caixa de seleção

  check 'name_of_checkbox'
vidur punj
fonte