2010-09-09 7 views
61

J'écris un testcase Selenium. Et voici l'expression xpath que j'utilise pour faire correspondre tous les boutons 'Modifier' dans une table de données. Ma question est, comment puis-je visiter les ensembles de nœuds correspondants par index? Je l'ai essayé avecComment sélectionner le noeud spécifié dans les ensembles de nœuds Xpath par index avec Selenium?

//img[@title='Modify'][i] 

et

//img[@title='Modify' and position() = i] 

Mais ne travaille .. J'ai aussi essayé avec XPath vérificateur (une extension firefox). Il ya tout à fait 13 correspondances trouvées, alors je n'ai aucune idée de comment je vais en sélectionner une. Ou est-ce que XPath supporte la sélection de nœuds qui ne sont pas sous le même nœud parent?

Répondre

131

Ceci est une FAQ:

//someName[3] 

signifie: tous someName éléments du document, qui sont le troisième someName enfant de ses parents - il peut être plusieurs de ces éléments.

Ce que vous voulez est exactement le 3ème élément someName:

(//someName)[3] 

Explication: le [] a une priorité plus élevée (priorité) que //.N'oubliez pas de toujours mettre entre parenthèses les expressions de type //someName lorsque vous devez spécifier le Nième nœud de la liste de nœuds sélectionnée.

+8

+1 pour l'explication de la préséance. –

+1

Merci beaucoup! Désolé j'ai totalement oublié les choses de préséance .. J'ai juste essayé et ça marche! –

+0

@ Kymair-Wu: Je suis content que cette réponse vous ait été utile. Ici, à SO, la façon d'exprimer sa gratitude est d'accepter une réponse (indice: cliquez sur la coche à côté de la réponse). :) –

13

Il n'y a pas de i dans XPath.

Soit vous utilisez les numéros littérales: //img[@title='Modify'][1]

Ou vous construisez la chaîne d'expression dynamique: '//img[@title='Modify']['+i+']' (mais gardez à l'esprit que les expressions XPath dynamiques ne fonctionnent pas de au sein XSLT).

Ou est-ce que XPath prend en charge la sélection des noeuds qui ne sont pas sous le même noeud parent?

Oui: (//img[@title='Modify'])[13]


Ce //img[@title='Modify'][i] signifie "tout <img> avec un titre de 'Modifier' et un élément enfant nommé <i>."

+0

+1 pour des explications sur '[i]' sens du prédicat –

+0

Remerciez vous beaucoup :) J'ai résolu mon problème .. –

+0

Pour une raison quelconque, j'avais besoin d'inclure l'index avant l'expression de l'attribut. Par exemple, pour trouver 'td's qui était le sixième enfant d'un' tr' et n'ont pas de contenu vide: '// tr/td [6] [longueur-de-chaîne (texte())> 0]' –

1
//img[@title='Modify'][i] 

est court pour

/descendant-or-self::node()/img[@title='Modify'][i] 

est donc le retour i'th noeud sous le même nœud parent.

Vous voulez

/descendant-or-self::img[@title='Modify'][i] 
+0

Juste '/ descendant :: img [@ title = 'Modifier'] [$ index]' fonctionnera correctement. Notez également que '[i]' test de prédicat pour l'existence de l'élément enfant 'i'. –

0

(// * [@ attribut = 'value']) [index] pour trouver la cible de l'élément alors que votre recherche de correspondances multiples dans ce

+1

Pouvez-vous expliquer un peu plus? – abhiarora

Questions connexes