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
.
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
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.)
Essayez cette page.execute_script("$('#agreement').attr('checked', true)")
. Pour que cela fonctionne, vous devez baliser vos exemples avec js: true
J'ai le même problème ... J'ai essayé ce qui suit, cela fonctionne bien ...
find('#tos', visible: false).set(true)
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.