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.
//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 (une extension firefox). Il y a au total 13 correspondances trouvées, alors je n'ai aucune idée de comment je vais en sélectionner une. Ou est-ce que XPath prend en charge la sélection spécifiée de nœuds qui ne sont pas sous le même nœud parent?
Il n'y a pas
i
dans XPath.Soit vous utilisez des nombres littéraux:
//img[@title='Modify'][1]
Ou vous créez la chaîne d'expression dynamiquement:
'//img[@title='Modify']['+i+']'
(mais gardez à l'esprit que les expressions XPath dynamiques ne fonctionnent pas à partir de XSLT).Oui:
(//img[@title='Modify'])[13]
Cela
//img[@title='Modify'][i]
signifie "tout<img>
avec un titre de" Modifier "et un élément enfant nommé<i>
."la source
td
s qui étaient le sixième enfant de atr
et qui n'ont pas de contenu vide://tr/td[6][string-length(text()) > 0]
est l'abréviation de
par conséquent renvoie le i'ème nœud sous le même nœud parent.
Tu veux
la source
/descendant::img[@title='Modify'][$index]
fonctionnera très bien. Notez également que le[i]
prédicat teste l'existence dei
l'élément enfant.Il n'y a pas
i
dans xpath n'est pas entièrement vrai. Vous pouvez toujours utiliser lecount()
pour trouver l'index.Considérez la page suivante
La page comporte 2 tables et 6 colonnes chacune avec des noms de colonne uniques et 6 lignes avec des données variables. La dernière ligne a le
Modify
bouton dans les deux tableaux.En supposant que l'utilisateur doit sélectionner le 4e
Modify
bouton du premier tableau en fonction de l'en-têteUtilisez le xpath
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
L'
count()
opérateur est pratique dans des situations comme celles-ci.Logique:
Modify
bouton à l'aide de//th[.='Heading 4']
count(//tr/th[.='Heading 4']/preceding-sibling::th)+1
Obtenez les lignes de l'en-tête correspondant à l'aide de
//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]
Obtenez le
Modify
bouton de la liste de nœuds extraite en utilisant//th[.='Heading 4']/ancestor::thead/following-sibling::tbody/tr/td[count(//tr/th[.='Heading 4']/preceding-sibling::th)+1]/button
la source
(// * [@ attribute = 'value']) [index] pour trouver la cible de l'élément pendant que vous y trouvez plusieurs correspondances
la source
Voici la solution pour la variable d'index
Disons que vous avez trouvé 5 éléments avec le même localisateur et que vous souhaitez effectuer une action sur chaque élément en fournissant un numéro d'index (ici, la variable est utilisée pour l'index comme "i")
Il faut XPath:
la source