100 votes

Comment obtenir nœud parent dans le Capybara?

Je travaille avec de nombreux plugins jQuery, qui créent souvent des éléments du DOM sans id ou l'identification d'autres propriétés, et la seule façon de les obtenir dans le Capybara (pour cliquant par exemple) - est d'obtenir leur voisin (un autre enfant de son ancêtre) en premier. Mais je n'ai pas trouver n'importe où, n'Capybara soutenir de telles choses, par exemple:

find('#some_button').parent.fill_in "Name:", :with => name

?

117voto

Pascal Lindelauf Points 2162

J'ai vraiment trouvé jamuraa réponse utile, mais pour plein de xpath m'a donné un cauchemar d'une chaîne de caractères dans mon cas, donc j'ai heureusement fait usage de la possibilité de concaténer trouver dans le Capybara, ce qui me permet de mélanger les css et xpath sélection. Votre exemple ressemblerait alors à ceci:

find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name

Capybara la mise à jour 2.0: find(:xpath,".//..") plus de chances dans un Ambiguous match d'erreur. Dans ce cas, utilisez first(:xpath,".//..") à la place.

46voto

B Seven Points 6496

Ce n'était pas de travail pour moi, avec l'erreur:

Ambiguous match, found 2 elements matching xpath ".//.."

J'ai trouvé ce qui ne fonctionne pas:

find(:xpath, '..')

Capybara a été mis à jour à l'appui de cette.

https://github.com/jnicklas/capybara/pull/505

39voto

jamuraa Points 2581

Il n'y a pas un moyen de le faire avec capybara et CSS. J'ai utilisé XPath dans le passé pour atteindre cet objectif, cependant, qui n'ont un moyen d'obtenir de l'élément parent et est pris en charge par Capybara:

find(:xpath, '//[@id="some_button"]/..').fill_in "Name:", :with => name

12voto

Ben Alavi Points 51

Si vous avez trébuché à travers ce que d'essayer de comprendre comment trouver n'importe quel parent (comme dans ancêtre) nœud (comme signalé dans @vrish88 commentaire de @Pascal Lindelauf de la réponse):

find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')

4voto

Harm de Wit Points 721

Je suis en utilisant une approche différente par trouver le parent de l'élément en utilisant d'abord le texte à l'intérieur de cet élément parent:

find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name

C'est peut-être utile dans une situation similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X