J’écris un test de Selenium. Et voici l’expression xpath que j’utilise pour faire correspondre tous les boutons “Modifier” dans un tableau de données.
//img[@title='Modify']
Ma question est la suivante: comment puis-je visiter les ensembles de nœuds correspondants par index? J’ai essayé avec
//img[@title='Modify'][i]
et
//img[@title='Modify' and position() = i]
Mais ni l’un ni l’autre ne fonctionne. J’ai aussi essayé avec XPath checker (One firefox extension). Il y a au total 13 correspondances trouvées, alors je ne sais absolument pas comment je vais en sélectionner une. Ou XPath supporte-t-il une sélection spécifiée de nœuds qui ne sont pas sous le même nœud parent?
Ceci est une FAQ :
//someName[3]
signifie : tous les éléments someName
dans le document, qui sont le troisième someName
de leur parent – il peut y avoir beaucoup de tels éléments.
Ce que vous voulez, c’est exactement le 3ème élément someName
:
(//someName)[3]
Explication : le []
a une priorité supérieure (priorité) à //
. N’oubliez pas de toujours mettre des expressions du type //someName
entre crochets lorsque vous devez spécifier le Nième nœud de la liste de nœuds sélectionnée.
Il n’y a pas de i
dans XPath.
Soit vous utilisez des nombres littéraux: //img[@title='Modify'][1]
Ou vous construisez la chaîne d’expression de manière dynamic: '//img[@title='Modify']['+i+']'
(mais gardez à l’esprit que les expressions XPath dynamics ne fonctionnent pas dans XSLT).
Ou XPath prend-il en charge une sélection spécifiée de nœuds qui ne sont pas sous le même nœud parent?
Oui: (//img[@title='Modify'])[13]
Cette //img[@title='Modify'][i]
signifie “tout
avec un titre de” Modifier “et un élément enfant nommé .”
//img[@title='Modify'][i]
est court pour
/descendant-or-self::node()/img[@title='Modify'][i]
retourne donc le iéme nœud sous le même nœud parent.
Tu veux
/descendant-or-self::img[@title='Modify'][i]
(// * [@ atsortingbute = ‘value’]) [index] pour trouver la cible de l’élément tout en y trouvant plusieurs correspondances
Il n’y a pas de i
dans xpath n’est pas tout à fait vrai. Vous pouvez toujours utiliser le count()
pour trouver l’index.
Considérez la page suivante
Heading 1 Heading 2 Heading 3 Heading 4 Heading 5 Heading 6 Data row 1 col 1 Data row 1 col 2 Data row 1 col 3 Data row 1 col 4 Data row 1 col 5 Data row 1 col 6 Data row 2 col 1 Data row 2 col 2 Data row 2 col 3 Data row 2 col 4 Data row 2 col 5 Data row 2 col 6 Data row 3 col 1 Data row 3 col 2 Data row 3 col 3 Data row 3 col 4 Data row 3 col 5 Data row 3 col 6 Data row 4 col 1 Data row 4 col 2 Data row 4 col 3 Data row 4 col 4 Data row 4 col 5 Data row 4 col 6 Data row 5 col 1 Data row 5 col 2 Data row 5 col 3 Data row 5 col 4 Data row 5 col 5 Data row 5 col 6
Heading 7 Heading 8 Heading 9 Heading 10 Heading 11 Heading 12 Data row 1 col 1 Data row 1 col 2 Data row 1 col 3 Data row 1 col 4 Data row 1 col 5 Data row 1 col 6 Data row 2 col 1 Data row 2 col 2 Data row 2 col 3 Data row 2 col 4 Data row 2 col 5 Data row 2 col 6 Data row 3 col 1 Data row 3 col 2 Data row 3 col 3 Data row 3 col 4 Data row 3 col 5 Data row 3 col 6 Data row 4 col 1 Data row 4 col 2 Data row 4 col 3 Data row 4 col 4 Data row 4 col 5 Data row 4 col 6 Data row 5 col 1 Data row 5 col 2 Data row 5 col 3 Data row 5 col 4 Data row 5 col 5 Data row 5 col 6