¿Cómo marcar una casilla de verificación en carpincho?

126

Estoy usando Rspec y Carpincho.

¿Cómo puedo escribir un paso para verificar un checkbox ? Lo he intentado checkpor valor pero no puede encontrar mi checkbox. No estoy seguro de qué hacer, ya que de hecho tengo la misma ID con diferentes valores

Aquí está el 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
fuente
66
Sus entradas no deberían tener las mismas ID, deberían tener los mismos nombres, pero diferentes ID.
SamStephens

Respuestas:

156

Encontré que lo siguiente funcionó para mí:

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

# Uncheck
find(:css, "#cityID[value='62']").set(false)
Jon M
fuente
1
¡Alegra oírlo! Tal vez marcarías esta respuesta como 'aceptada' y tal vez la votarías ... :)
Jon M
@ Jon MI tiene alguna identificación extraña con corchetes vacíos, por lo que para el ejemplo de verificación ... find(:css, "#cityID[value='62']").set(true)funcionará pero find(:css, "#cityID[][value='62']").set(true)no se encontrará y fallará. ¿Cómo ejecuto la misma función con un ID de soporte vacío?
TangibleDream
1
@TangibleDream solo para aclarar: ¿está diciendo que la casilla de verificación tiene una ID de '[]'?
Jon M
1
¡No pude encontrar una manera de hacer que esto funcione con el selector CSS! Debe haber alguna forma de escapar del corchete, pero no pude encontrarlo. Tuve que recurrir a un buscador XPath:find(:xpath, ".//input[@id='Extrapainful[]'][@value='12345']").set(true)
Jon M
3
¿Puedo marcar esta respuesta? Sé que funciona, pero es contrario a la intuición marcar una respuesta que no es parte de la API simple disponible: marque ('nombre, id o texto aquí') (vea la respuesta a continuación)
Código Noviciado
137

Es mejor no crear múltiples elementos con la misma identificación , de modo que (y no solo para eso) pueda marcar / desmarcar fácilmente una casilla de verificación con elegante

check 'cityID'
uncheck 'cityID'

Si uno no puede evitar múltiples elementos con la misma identificación y aún necesita marcar una casilla de verificación con cierto valor , puede hacerlo con

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

Puede encontrar más información sobre manipulaciones de entrada de carpincho aquí

installero
fuente
2
También es mejor no crear múltiples elementos con la misma identificación porque no es HTML válido. Eso no debería ser un problema si el uso de rieles forma los ayudantes correctamente.
ihaztehcodez
1
Me gustaría agregar que la casilla de verificación / desmarcar solo acepta los siguientes valores: id, nombre o elemento de etiqueta relacionado. Aquí puedes leer más al respecto.
Nesha Zoric
58

Cuando ejecutas la prueba de carpincho, obtienes el pageobjeto. Esto puede usar para marcar / desmarcar las casillas de verificación. Como @buruzaemon ya mencionó:

para buscar y marcar una casilla de verificación por nombre, id o texto de etiqueta.

Así que supongamos que tienes una casilla de verificación en tu html como:

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

Puede verificar esto con:

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

Desmarcar es el mismo, solo use el page.uncheckmétodo.

p1100i
fuente
1
respuesta sólida, parece más limpia que la respuesta aceptada usando selectores css (incluso si eso es lo que hace el método de verificación debajo de las cubiertas)
agmin
1
Sí, esta es la mejor respuesta. Es más limpio e imita de cerca la acción del usuario. No contamina el formulario con identificaciones adicionales y hace que las pruebas sean fáciles de leer.
B Seven
Estoy de acuerdo en que esto es más limpio. Curiosamente, la respuesta aceptada no es muy diferente de cómo checkse implementa el método en Carpincho. def check(locator, options={}) find(:checkbox, locator, options).set(true) end
bigtunacan
Gracias, y esta es la misma respuesta según los documentos: rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/… "Busque una casilla de verificación y márquela como marcada. La casilla de verificación se puede encontrar por nombre, ID o texto de la etiqueta ".
Mike Vallano
10

Si el cuadro está asociado con el texto, por ejemplo, 'Opción 3', a partir de entonces, capybara 3.0.3simplemente puede

check 'Option 3'
Obromios
fuente
1
Esta respuesta debe estar en la parte superior, no en la sintaxis de 8 años.
sloneorzeszki
En realidad, para el escenario descrito por el autor, la respuesta de @samuel es la correcta
VP.
6

Sé que esta es una pregunta anterior, pero he estado trabajando en esto yo mismo, y después de haber intentado todo lo anterior, esto es lo que finalmente funcionó para mí:

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

Espero que esto sea útil para alguien. Estoy usando Capybara 2.4.4.

Michael Cruz
fuente
4

Un viejo tema pero otra solución es:

check('Option 3', allow_label_click: true)

Samuel
fuente
1

también puede usar: xpath en lugar de: css si tiene problemas para encontrarlo.

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

en Chrome (y seguramente en otros navegadores), puede "inspeccionar el elemento" y luego al hacer clic derecho en el elemento que le interesa, hay 'copiar xpath' si no sabe qué era xpath, ahora lo sabe.

kulssaka
fuente
1

También puede verificar que todas las casillas de verificación no estén marcadas con este ejemplo.

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

usuario3853159
fuente
1

.set (true) no funcionó para mí, así que tuve que llamar a .click:

find(...).click

Hector perez
fuente
(1) No creo que clicksea ​​un comando de capibara válido (o al menos si lo está, no parece estar en los documentos), y (2) si lo fuera, probablemente activaría la casilla de verificación, no asegurarse de que estaba encendido o apagado
NotAnAmbiTurner
1

Tuve algunos problemas con la casilla de verificación personalizada que está oculta detrás del elemento de etiqueta. Necesitaba unallow_label_click: true .

Con referencia a esta publicación de blog ,

check 'checkbox[name]', allow_label_click: true
Vic
fuente
¡Gracias! Esto funcionó perfectamente con un campo de casilla de verificación personalizado Boostrap 4. Además, en caso de que necesite desmarcarlo, puede: desmarcar 'casilla de verificación [nombre]', allow_label_click: true
pastullo
0
check find(".whenever input")[:id]

Creo que esto hará que el capibara espere a cualquier escucha de eventos adjunto a esa entrada, que a veces es un fastidio si no espera ... Si esa entrada no tiene una ID, elija otra propiedad (debe haber uno) ...

Willian Tenfen Wazilewski
fuente
0

para seleccionar la casilla de verificación

  check 'name_of_checkbox'
vidur punj
fuente