Pregunta Carpincho: no se puede encontrar css


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 disparará el onclick método, cuando se hace clic en la casilla de verificación? me siento como find(:css, '#agreement').set(true) no activará el onclick evento. 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 span elemento no hay problema

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 label elemento en el span sin problema


32
2018-01-09 23:43


origen


Respuestas:


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

32
2018-02-05 11:53



Intenta agregar :visible opción establecida en falso.

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 La opción también es compatible con la mayoría de otros métodos de Capybara (como check, has_css?, have_selector, etc.)


9
2018-01-19 08:33



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


3
2018-01-19 13:11



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

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

1
2018-01-23 17:22



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.

Tengo esta idea, ya que mencionaste en uno de los comentarios que te llevan al servidor interno de tu dominio cuando haces save_and_open_page en 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.


0
2018-01-19 13:24



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 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.

-1
2018-01-22 18:21