2017-10-12 12 views
0

Je suis en train de trouver un lien par classes CSS et ids mais toujours obtenir une erreur: Capybara::ElementNotFound: Unable to find css ...Vous ne trouvez pas lien en utilisant Capybara et Rspec lors de l'écriture d'un test d'intégration

La pièce réelle de code est:

find('#bucket_resources_containers > #user_base_widget.widget > 
div.widget_header > div.right.may- 
edit.control.button.add.icon.add_options > a.tasksy.options').click 

La source de la page est: enter image description here

+0

Puisque l'élément sur lequel vous essayez de cliquer n'a pas de contenu, a-t-il réellement une taille sur la page? Sinon, il sera considéré comme non visible. En outre, l'utilisation de sélecteurs spécifiques va rendre vos tests vraiment cassants, au moins l'un des sélecteurs d'identifiants ne devrait pas être nécessaire car l'autre devrait toujours identifier de manière unique un élément, et la plupart des classes que vous spécifiez sont probablement inutiles. –

+0

@ThomasWalpole, je comprends qu'il devrait être quelque chose comme 'find ('# bucket_resources_containers> #user_base_widget> div> div> a'). Click', mais trouve seulement le premier élément div' '# bucket_resources_containers'. –

+0

@ThomasWalpole Les éléments n'étaient pas visibles. Tout fonctionne bien. –

Répondre

0

Vous avez donné la réponse dans votre commentaire, l'élément n'était pas visible.

Réponse courte: find_link(selector, visible: :all).click

Comme capybara montre dans le documentation:

By default Capybara will only locate visible elements. This is because a real user would not be able to interact with non-visible elements.

localisent uniquement les éléments visibles est une conception intelligente de capybara, il évite de penser qu'un utilisateur serait en mesure de trouver l'élément.

Le find_linkmethod documentation ne vous aide pas beaucoup lors de la recherche pour les liens cachés, car il montre que ces options: wait, href, id, title, alt, class:

#find_link([locator], options = {}) ⇒ Capybara::Node::Element 

Mais vous voyez sur l'finding documentation il y avait une option visible:

find_link('Hello', :visible => :all).visible? 
find_link(class: ['some_class', 'some_other_class'], :visible => :all).visible? 

Cette option visible provient de la méthode #all, where you can see here. Il peut avoir ces valeurs:

true - only finds visible elements. 
false - finds invisible and visible elements. 
:all - same as false; finds visible and invisible elements. 
:hidden - only finds invisible elements. 
:visible - same as true; only finds visible elements. 

Ainsi, dans votre cas, vous pouvez utiliser visible: false, si vous pensez vraiment à cacher, ou visible: :all si vous ne se soucient pas de la visibilité.