Je travaille avec de nombreux plugins jQuery, qui créent souvent des éléments DOM sans identifiant ou autres propriétés d'identification, et le seul moyen de les obtenir dans Capybara (pour cliquer par exemple) - est d'obtenir d'abord leur voisin (un autre enfant de son ancêtre) . Mais je n'ai trouvé nulle part, est-ce que Capybara prend en charge de telles choses par exemple:
find('#some_button').parent.fill_in "Name:", :with => name
?
Réponses:
J'ai vraiment trouvé la réponse de jamuraa utile, mais opter pour un xpath complet m'a donné un cauchemar d'une chaîne dans mon cas, alors j'ai utilisé avec plaisir la capacité de concaténer les find dans Capybara, me permettant de mélanger la sélection css et xpath. Votre exemple ressemblerait alors à ceci:
find('#some_button').find(:xpath,".//..").fill_in "Name:", :with => name
Mise à jour Capybara 2.0 :
find(:xpath,".//..")
entraînera très probablement uneAmbiguous match
erreur. Dans ce cas, utilisez à lafirst(:xpath,".//..")
place.la source
.//..
de trouver le parent - cela..
suffit, et ce n'est jamais non plus ambigu.Il n'y a pas moyen de faire cela avec capybara et CSS. J'ai cependant utilisé XPath dans le passé pour atteindre cet objectif, qui a un moyen d'obtenir l'élément parent et est pris en charge par Capybara:
find(:xpath, '//*[@id="some_button"]/..').fill_in "Name:", :with => name
la source
find(:xpath, '//*[@id="some_button"]/..')
J'ai trouvé ce qui suit qui fonctionne:
find(:xpath, '..')
Capybara a été mis à jour pour prendre en charge cela.
https://github.com/jnicklas/capybara/pull/505
la source
Si vous êtes tombé sur ceci en essayant de trouver un nœud parent (comme dans l' ancêtre ) (comme indiqué dans le commentaire de @ vrish88 sur la réponse de @Pascal Lindelauf):
find('#some_button').find(:xpath, 'ancestor::div[@id="some_div_id"]')
la source
Cette réponse concerne la manière de manipuler un élément frère, ce à quoi je pense que la question originale fait allusion
Votre hypothèse de question fonctionne avec une modification mineure. Si le champ généré dynamiquement ressemble à ceci et n'a pas d'identifiant:
<div> <input></input> <button>Test</button> </div>
Votre requête serait alors:
find('button', text: 'Test').find(:xpath, "..").find('input').set('whatever')
Si l'entrée générée dynamiquement est jointe avec un élément id (soyez prudent avec ceux-ci bien que comme en angulaire, ils ne changeront pas en fonction de l'ajout et de la suppression d'éléments), ce serait quelque chose comme ceci:
find('button', text: 'Test').find(:xpath, "..").fill_in('#input_1', with: 'whatever')
J'espère que ça t'as aidé.
la source
J'utilise une approche différente en recherchant d'abord l'élément parent en utilisant le texte dans cet élément parent:
find("<parent element>", text: "text within your #some_button").fill_in "Name:", with: name
Peut-être que cela est utile dans une situation similaire.
la source
J'avais besoin de trouver un ancêtre avec une classe css, même s'il était indéterminé si l'ancêtre cible avait une ou plusieurs classes css présentes, donc je ne voyais pas de moyen de faire une requête xpath déterministe. J'ai travaillé ceci à la place:
def find_ancestor_with_class(field, cssClass) ancestor = field loop do ancestor = ancestor.find(:xpath, '..') break if ancestor.nil? break if ancestor.has_css? cssClass end ancestor end
Attention: utilisez-le avec parcimonie, cela pourrait vous coûter beaucoup de temps dans les tests alors assurez-vous que l'ancêtre n'est qu'à quelques sauts.
la source
break if ancestor[:class].split(" ").include?(css_class)
.ancestor(selector)
méthode intégrée. Voir github.com/teamcapybara/capybara/commit/…C'est ici
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Il y a une méthode parent présente;)
la source