tutorial rails how rspec capybara capybara-webkit

rspec - rails - capybara tutorial



Carpincho: no se puede encontrar css (6)

Estoy usando capibara para hacer clic en una casilla de verificación, sin embargo, parece que no puede encontrarlo sin importar lo que haga. Puedo encontrar correctamente el lapso y la etiqueta dentro del tramo, pero no la entrada que realmente necesito.

Aquí está la casilla

<span class="checkbox tos"> <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false"> <label for="agreement">I accept the <a href="http://www.dev.com:3000/terms" target="_blank">Terms of Use</a>, <a href="http://www.dev.com:3000/privacy" target="_blank">Privacy Policy</a>, and am at least 13 years old</label> </span>

Y aquí están algunas de las cosas que he intentado

page.check(''agreement'') find(:css, ''#agreement'').set(true) find(''#agreement'').set(true) find(''#agreement'').click

Sin embargo, todos me dan el mismo error

Unable to find css "#agreement" (Capybara::ElementNotFound)

También me pregunto si alguno de estos métodos se activará con el método onclick , cuando se haga clic en la casilla de verificación. Siento que find(:css, ''#agreement'').set(true) no desencadenará el evento onclick . Sin embargo, no estoy seguro del resto.

Actualizar

También he intentado seleccionar el elemento a través de xpath. Aquí están las varias cosas que he descubierto

find(:xpath, ''//*[@id="registration"]/span[2]'')

Esto es capaz de encontrar el elemento span sin problemas

find(:xpath, ''//*[@id="registration"]/span[2]/input'')

Esto no puede encontrar el elemento que necesito, pero este xpath selecciona correctamente el elemento en la consola de Chrome

find(:xpath, ''//*[@id="agreement"]'')

Esto no puede encontrar el elemento que necesito, pero el xpath selecciona el elemento en la consola de Chrome

find(:xpath, ''//*[@id="registration"]/span[2]/label'')

Esto es capaz de encontrar el elemento de label en el span sin ningún problema.


Difícil de ver sin ver toda la página HTML. Aquí hay algunos posibles problemas:

  1. Es posible que esté buscando la casilla de verificación antes de que la página esté completamente cargada. Asegúrate de tener suficiente tiempo de espera antes de llamar a find(#agreement)
  2. Puede tener varias etiquetas con la misma ID = "acuerdo". Asegúrate de tener solo uno.
  3. Asegúrese de que la página sea HTML válida.
  4. Asegúrese de que la casilla de verificación esté visible y habilitada, y de que agreeValidate () esté funcionando correctamente.

El problema es que la página no se está procesando porque lo llevan a otra página. Para resolver esto, no necesitas cambiar tu código de Capibara. Es probable que deba hacer algunos cambios en su código de controlador.

Obtuve esta idea, ya que mencionaste en uno de los comentarios que te llevaron al servidor interno de tu dominio al hacer save_and_open_page en save_and_open_page lugar. Proporcione los detalles de lo que ve en el servidor interno. ¿Hay algún mensaje de error que vea allí? Además, proporcione su código para la acción del controlador de esa vista en la que desea marcar una casilla de verificación y cualquier otro código que haya definido que se llame en esa acción del controlador.


Intente agregar :visible opción :visible establecida en falsa.

find(''#agreement'', visible: false).click

Por defecto, Capybara encuentra solo elementos visibles. Parece que el controlador subyacente identificó esta entrada como invisible, por lo que no fue encontrada por Capybara.

:visible opción :visible también es compatible con la mayoría de otros métodos de Capybara (como check , has_css? have_selector , etc.)


Pruebe this page.execute_script("$(''#agreement'').attr(''checked'', true)") . Para que esto funcione, debe etiquetar sus ejemplos con js: true


Tengo el mismo problema ... Intenté lo siguiente, funciona bien ...

find(''#tos'', visible: false).set(true)


Tuve el problema exacto ayer. Capibara ignoraba automáticamente la entrada porque era invisible. Lo resolví con lo siguiente:

find(''#agreement'', :visible => false).click

También puede agregar lo siguiente a env.rb para permitir que Capybara interactúe con todos los elementos ocultos:

Capybara.ignore_hidden_elements = false