Glossaire · Automatisation de l’UI
XPath
Également appelé : expression XPath, expressions XPath, XPath expression, XPaths
Définition
Langage de requête qui sélectionne des nœuds dans un document XML ou HTML, utilisé en automatisation d'interface pour localiser des éléments par structure, attributs ou texte.
XPath (XML Path Language) décrit un chemin à travers l’arbre d’un document jusqu’aux nœuds recherchés. En automatisation des tests, c’est l’une des manières d’écrire un locator, et son principal avantage sur CSS est de pouvoir filtrer sur le contenu textuel et de se déplacer dans toutes les directions : vers un parent, vers un frère ou vers un descendant. Les navigateurs implémentent XPath 1.0 : les fonctions des versions ultérieures, comme matches() ou lower-case(), ne sont donc pas disponibles.
Exemple
//button[normalize-space()='Sign in']
//input[@name='email']
//label[text()='Password']/following-sibling::input
//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']
//a[contains(@href, '/invoices/')]
La quatrième ligne montre pourquoi on se tourne vers XPath : trouver la ligne de tableau qui contient une cellule donnée, puis le bouton à l’intérieur de cette ligne.
WebElement cancel = driver.findElement(
By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));
Absolu ou relatif
Un XPath absolu part de la racine (/html/body/div[2]/form/button) et casse dès qu’un conteneur change. Un XPath relatif commence par // et s’ancre sur quelque chose de significatif. Copier le « full XPath » depuis les DevTools vous donne la forme absolue, ce qui n’est presque jamais ce que vous voulez dans un test.
Erreurs fréquentes
- Les chemins fondés sur des index comme
(//div)[7]. Ils encodent la mise en page, pas le sens. text()sur des éléments au markup imbriqué.//button[text()='Save']échoue si le libellé se trouve dans un<span>enfant.normalize-space()(ou.) utilise à la place la valeur textuelle complète.- Cibler une classe avec
@class='btn'. Cela ne fonctionne que sibtnest la valeur entière de l’attribut. Utilisezcontains(concat(' ', normalize-space(@class), ' '), ' btn '), ou passez au sélecteur CSS.btn. - Utiliser XPath par habitude. Dans Playwright,
getByRoleetgetByTextcouvrent la plupart des cas fondés sur le texte et se lisent mieux.