web-dev-qa-db-fra.com

Capybara: impossible de trouver css

J'utilise capybara pour cliquer sur une case à cocher, mais il ne semble pas le trouver, peu importe ce que je fais. Je suis capable de trouver correctement la plage et l'étiquette à l'intérieur de la plage, mais pas l'entrée dont j'ai réellement besoin.

Voici la case à cocher

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

Et voici certaines des choses que j'ai essayées

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

Cependant, ils me donnent tous la même erreur

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

Je me demande également si l'une de ces méthodes déclenche la méthode onclick, lorsque la case est cochée? J'ai l'impression que find(:css, '#agreement').set(true) ne déclenchera pas l'événement onclick. Cependant, je ne suis pas sûr du reste.

Mise à jour

J'ai également essayé de sélectionner l'élément via xpath. Voici les différentes choses que j'ai découvertes

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

Ceci est capable de trouver l'élément span sans problème

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

Cela ne peut pas trouver l'élément dont j'ai besoin, mais ce xpath sélectionne correctement l'élément dans la console de Chrome

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

Cela ne peut pas trouver l'élément dont j'ai besoin, mais le xpath sélectionne l'élément dans la console de Chrome

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

Ceci est capable de trouver sans problème l'élément label dans le span.

34
user2158382

J'ai eu le problème exact hier. Capybara ignorait automatiquement l'entrée car elle était invisible. Je l'ai résolu avec ce qui suit:

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

Vous pouvez également ajouter ce qui suit à env.rb pour permettre à Capybara d'interagir avec tous les éléments cachés:

Capybara.ignore_hidden_elements = false
36
parad1gm

Essayez d'ajouter l'option :visible Définie sur false.

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

Par défaut, Capybara ne trouve que des éléments visibles. Il semble que le pilote sous-jacent ait identifié cette entrée comme invisible, de sorte qu'elle n'a pas été trouvée par Capybara.

L'option :visible Est également prise en charge par la plupart des autres méthodes Capybara (comme check, has_css?, have_selector, Etc.)

10
Andrei Botalov

Essayez cette page.execute_script("$('#agreement').attr('checked', true)"). Pour que cela fonctionne, vous devez baliser vos exemples avec js: true

3
Siva Gollapalli

J'ai le même problème ... J'ai essayé ce qui suit, cela fonctionne bien ...

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

Le problème est que la page n'est pas rendue car vous êtes redirigé vers une autre page. Pour résoudre ce problème, vous n'avez pas besoin de modifier votre code Capybara. Vous devrez probablement apporter des modifications à votre code de contrôleur.

J'ai eu cette idée depuis que vous avez évoqué l'un des commentaires selon lesquels vous êtes redirigé vers le serveur interne de votre domaine lorsque vous effectuez save_and_open_page au lieu. Veuillez me fournir les détails de ce que vous voyez sur le serveur interne. Y a-t-il des messages d'erreur que vous voyez là-bas? Veuillez également me fournir votre code pour l'action de contrôleur de la vue sur laquelle vous souhaitez cocher une case et tout autre code que vous avez défini et appelé dans cette action de contrôleur.

0
Gjaldon