Dès qu’on veut automatiser des tests, il faut localiser les éléments avec lesquels on veut interagir. Les 2 types de sélecteurs pour faire cela sont :
- les sélecteurs CSS
- le langage XPath

CSS Selectors
Les sélecteurs CSS (Cascading Style Sheet) allient puissance, rapidité et concision. Ils sont donc un choix pertinent dans énormément de vos sélecteurs.
Voici la liste des sélecteurs CSS à connaitre par coeur :
X
pour chercher les balises de type <x>.classname
pour chercher les éléments qui ont l’attributclass="classname"
- On peut mixer les 2 points ci-dessus en un seul élément, comme
h1.foo
pour récupérer tous les noeudsh1
qui ont une classe “foo”) #idname
pour chercher les éléments qui ont l’attributid="idname"
[attribute-name="foo"]
pour chercher les éléments qui ont un attribut “attribute-name” avec la valeur “foo”[attribute-name^="foo"]
pour chercher les éléments qui ont un attribut “attribute-name” dont la valeur commence par “foo”[attribute-name*="foo"]
pour chercher les éléments qui ont un attribut “attribute-name” dont la valeur contient “foo”[attribute-name$="foo"]
pour chercher les éléments qui ont un attribut “attribute-name” dont la valeur se termine par”foo”li a
pour tous les descendants deli
qui sont de typea
li > a
pour tous les descendants directs deli
qui sont de typea
ul li:first-child
,:nth-child(N)
, et:last-child
pour respectivement retourner le premier, le N-ième, et le dernier enfant (de typeli
dans notre exemple)
Il n’existe pas de sélecteur CSS se basant sur le texte affiché à l’écran, ce qui peut être bloquant dans certains cas. De même, il est impossible de remonter dans l’arborescence du DOM avec les CSS selectors.
Si vous voulez une liste plus complète de CSS sélecteurs, je vous invite à aller voir https://www.freecodecamp.org/news/css-selectors-cheat-sheet/.
Avant de choisir un sélecteur CSS, testez le toujours dans la console de votre navigateur, via la commande
$('...')
pour ne retourner que le premier élément correspondant$$('...')
pour retourner l’ensemble des éléments correspondants.
Personnellement, je recommande de toujours utiliser le $$('...')
pour être sûr que votre sélecteur ne correspond pas à plusieurs éléments.
XPath
Si vous souhaitez une documentation complète sur les XPath, je vous invite à consulter la cheatsheet https://devhints.io/xpath. Pour autant, pour l’utilisation dans des tests automatisés, la liste suivante devrait répondre à l’immense majorité de vos besoins :
//div
sélectionne toutes les balisesdiv
//div[@attribute-name="foo"]
sélectionne toutes les balises ayant un attribut"attribute-name='foo'"
//*[starts-with(@attribute-name,"foo")],
//*[contains(@attribute-name,”foo”)], //*[ends-with(@attribute-name,”foo”)] sélectionnent respectivement toutes les balises ayant un attribut"attribute-name"
commençant, contenant, et se terminant par “foo”//div//li
sélectionne tous lesli
descendants dediv
//div/li
sélectionne lesli
descendants directs dediv
//div/li[1]
pourdiv > li:first-child
en CSS//div/li[2]
pour lediv > li:nth-child(2)
en CSS//div/li[last()]
pour lediv > li:last-child
//button[text()="Submit"]
sélectionne les éléments de typebutton
et dont le texte affiché est “Submit”//button[contains(text(), "Submit")]
sélectionne les éléments de typebutton
et dont le texte affiché contient “Submit”
A noter qu’il est aussi possible avec XPath de remonter dans l’arborescence grâce à /../
.
De la même manière que pour les sélecteurs CSS, utilisez $x(‘…’) dans la console pour tester votre sélecteur XPath pour vous assurer qu’il ne correspond pas à plusieurs éléments.
Le bon et le mauvais sélecteur

Un bon sélecteur doit être :
- court : si votre sélecteur a 4 étages ou plus (comme
div > ul li a
), vous vous y êtes sûrement mal pris. Il doit être possible de trouver un sélecteur plus direct, ou de retirer certains étages superflus. - unique : si votre sélecteur n’est pas suffisamment précis, il risque de cibler d’autres éléments : vous obtiendrez alors des comportements étranges dans vos tests (potentiellement pénibles à débugger).
- robuste face aux évolutions logiciel : si votre sélecteur est trop dépendant de l’arborescence, il y a un fort risque que la moindre évolution graphique casse votre sélecteur.
Je conseille d’utiliser les CSS selectors dès que possible pour profiter pleinement de leur lisibilité. Pour autant, certaines situations sont plus adaptées aux XPath, donc ne les boycottez pas complètement : sachez passer de l’un à l’autre dès que nécessaire.
Créez vos propres attributs d’éléments
class
) sont générés aléatoirement avec certaines librairies React. Impossible alors d’utiliser des sélecteurs se basant dessus puisqu’ils changent à chaque utilisation.- choisissez avec les développeurs un nom d’attribut qui sera dédié à l’automatisation des tests (chez Slack, ils ont choisi “data-qa” par exemple ; cf screenshot ci-après)
- créez dans votre librairie de tests une fonction qui permet de cibler ce sélecteur simplement
- pendant la spécification des features (pendant les 3 amigos par exemple), indiquez aux développeurs quelles sont les valeurs de ces attributs, et ce pour chaque élément avec lequel vous interagirez dans vos tests automatisés

Grâce à ça, vous remplissez toutes les cases d’un bon sélecteur puisqu’ils seront courts (vous ciblez directement le bon élément, donc un seul étage), uniques (les valeurs que vous avez définies), et robustes (vous êtes indépendants de l’architecture du DOM). Ainsi, même si un élément devait changer de position, votre sélecteur associé serait toujours valide !
La cheatsheet
Ce qu’il faut retenir
- Un bon sélecteur doit être court, unique, et robuste face aux évolutions logiciels
- Les sélecteurs CSS sont rapides, pratiques, et lisibles
- Les sélecteurs XPath sont puissants, mais moins lisibles
- Créez vos propres attributs dédiés aux tests automatisés