Encore un « element not found » ? Comment tester quand les sélecteurs et les localisateurs échouent
« Element not found » ?Pourquoi les sélecteurs et localisateurs cassent (identifiants dynamiques, shadow DOM, iframes, canvas) et comment tester sans localisateur à maintenir.
« Element not found » signifie que votre test a cherché un élément avec un localisateur et que rien n'a correspondu à temps.La solution est rarement un meilleur localisateur : c'est un test qui vérifie ce que voit l'utilisateur.
Tout ingénieur QA connaît ce matin-là : vingt tests rouges, et pas une seule vraie anomalie.Un développeur a renommé une classe, l'équipe design a déplacé une bannière, une mise à jour du framework a changé les identifiants.Cet article explique pourquoi les localisateurs cassent, comment corriger l'erreur quand elle arrive, où s'arrêtent les solutions habituelles et comment tester sans sélecteur à maintenir.
Que signifie « element not found » ?
Définition
Une erreur « element not found » signifie que le test a demandé un élément avec un localisateur et que rien dans la page n'y a correspondu avant le délai d'attente.
- Un localisateur, aussi appelé sélecteur, est l'adresse que le test utilise pour l'élément : un identifiant, un sélecteur CSS, un XPath, un rôle et un nom, un texte.
- Selenium lève NoSuchElementException, Playwright termine l'action par un dépassement de délai, et chaque autre framework a son propre nom pour cela.
Le message est toujours le même au bout du compte : le test a perdu l'élément, que l'utilisateur l'ait perdu ou non.
La page de dépannage de Selenium donne trois causes probables : vous cherchez au mauvais endroit, vous cherchez au mauvais moment, ou le localisateur a changé depuis que vous avez écrit le code.Seule la dernière concerne le localisateur lui-même, et c'est celle qui grandit à chaque version.
#save-8f3a2c
Une nouvelle compilation génère un autre identifiant
.btn-primary
Une refonte renomme la classe
text=Save
La version française dit Enregistrer
//div[3]/form/button[2]
Une bannière est ajoutée au-dessus du formulaire
À l'écran
SaveInchangé pour l'utilisateur
Pourquoi les sélecteurs et les localisateurs cassent-ils ?
Un localisateur est une supposition sur la façon dont l'application est construite.Tout ce qui change la construction sans changer ce que voit l'utilisateur peut le casser.
| Ce qui a changé | Les localisateurs qui cassent | L'utilisateur l'a-t-il remarqué ? |
|---|---|---|
| Identifiants et noms de classe générés | Un identifiant ou une classe écrits par le framework, différents à chaque compilation ou chargement de page | Non |
| Une refonte ou un refactoring | Les chaînes CSS et les XPath qui suivent la structure de la page | Souvent non |
| Un test A/B | Tout localisateur de la variante que votre test n'attendait pas | Seulement les utilisateurs de cette variante |
| Une traduction | Les localisateurs par texte visible ou nom accessible | Non, si la traduction est juste |
| Shadow DOM et iframes | Les localisateurs qui ne peuvent pas entrer dans le composant ou dans le cadre | Non |
| Une liste virtualisée | Les localisateurs d'une ligne qui n'est pas dessinée tant qu'on ne l'a pas fait défiler à l'écran | Non |
| Un canvas, un jeu ou une application sans arbre d'accessibilité | Tous les localisateurs : il n'y a rien à l'intérieur à désigner | Non |
Identifiants dynamiques et noms de classe générés
Beaucoup de frameworks écrivent leurs propres identifiants et noms de classe, comme save-8f3a2c ou css-1x7hq.Ils sont uniques, ce qui les fait ressembler à des localisateurs parfaits, et ils changent à la compilation suivante.Un test enregistré sur eux passe aujourd'hui et échoue après le prochain déploiement, sur une page que personne n'a touchée.
Refontes, refactorings et tests A/B
Un sélecteur CSS comme .form > div:nth-child(3) button ou un XPath comme //div[3]/form/button[2] décrit un chemin à travers la page.Enveloppez le formulaire dans un nouveau conteneur, ajoutez une bannière au-dessus ou inversez deux champs, et le chemin mène ailleurs.Un test A/B fait la même chose exprès : la moitié des visiteurs reçoit une page pour laquelle vos localisateurs n'ont pas été écrits.
La documentation de Playwright le dit clairement : les sélecteurs XPath et CSS peuvent être liés à la structure du DOM, et ils peuvent casser quand elle change.
Localisation et localisateurs par texte
Les localisateurs par texte, libellé ou nom accessible survivent à une refonte, c'est pourquoi ils sont recommandés.Ils ne survivent pas à une traduction.Un bouton trouvé par le nom Save n'est plus trouvé quand la version française dit Enregistrer, donc un produit localisé a besoin d'un localisateur par langue, ou d'un identifiant de test.
Shadow DOM et iframes
Une iframe est une page dans la page, et un composant web garde ses éléments internes dans une shadow root.Selenium ne connaît que les éléments du document de premier niveau : un test codé doit donc d'abord être dirigé dans le cadre, sinon il signale que l'élément n'existe pas.Certains localisateurs, comme XPath, ne peuvent pas du tout entrer dans un composant.
Listes et grilles virtualisées
Un tableau de dix mille lignes est rapide parce qu'il ne les dessine pas toutes.AG Grid, une grille de données très utilisée, explique qu'elle ne dessine que ce que vous voyez à l'écran, plus une petite réserve de lignes au-dessus et en dessous.La ligne 500 n'est pas dans la page tant que personne n'a fait défiler jusqu'à elle, donc un localisateur ne la trouve pas, alors qu'une personne ferait simplement défiler.
Comment corriger une erreur « element not found »
Dans Selenium, Playwright ou Cypress, corriger l'erreur est votre travail, et il revient à chaque version.Dans GUI Test Studio, il n'y a aucun localisateur à corriger.
| Ce qui s'est passé | Dans un framework codé | Dans GUI Test Studio |
|---|---|---|
| L'élément apparaît tard | Vous écrivez une attente sur la bonne condition | Chaque assertion attend d'elle-même jusqu'à son délai |
| L'élément est dans un cadre ou une shadow root | Vous écrivez le passage dans le cadre ou le composant | L'élément est trouvé là où il est dessiné à l'écran |
| Une refonte a changé les identifiants ou la structure | Vous réécrivez le localisateur, souvent dans de nombreux tests | Rien à réécrire : un autre moyen, ou son image, le trouve |
| L'élément a changé volontairement | Vous modifiez le code du test | Un clic dans le rapport accepte le nouvel aspect |
Quand un test GUI Test Studio s'arrête bien sur un élément, ces cinq étapes règlent la question, sans rien coder.
- 1
Ouvrez le Rapport de confiance de l'exécution
Le rapport s'ouvre après chaque exécution, sur le premier échec.Il montre l'image attendue à côté de l'écran au moment où l'assertion a abandonné, pour que vous voyiez si l'élément manquait, était masqué ou se trouvait ailleurs.
- 2
Vérifiez où l'exécution a commencé
Un test part de l'écran d'où son enregistrement est parti.Si l'application était sur une autre page ou contenait d'autres données, remettez-la comme elle était et relancez le test.
- 3
Élargissez la zone de recherche si l'élément a beaucoup bougé
Quand rien n'est trouvé dans la zone de recherche d'une assertion, la recherche s'élargit déjà d'elle-même à tout l'écran.Si l'élément se trouve désormais ailleurs pour de bon, cliquez sur Élargir la zone de recherche dans le rapport et définissez la nouvelle zone dans GUI Test Studio.
- 4
Acceptez un changement voulu
Si l'élément a un autre aspect parce que le design a changé, cliquez sur Accepter le résultat obtenu comme attendu dans le Rapport de confiance et enregistrez.Le test est à jour, sans code à modifier.
- 5
Signalez l'anomalie si l'élément a vraiment disparu
Si l'élément a disparu, le test a fait son travail.Cliquez sur Rapport d'anomalie pour le signaler en PDF ou en ticket Jira, avec les images jointes.
CSS, XPath, rôle ou identifiant de test : chaque localisateur a son point faible
Les équipes qui écrivent des tests codés choisissent un localisateur pour chaque élément qu'elles touchent.Chaque type échoue à sa manière.
| Localisateur | Exemple | Il casse quand | Il survit à |
|---|---|---|---|
| Identifiant ou classe générés | #save-8f3a2c | La compilation suivante | Presque rien |
| Sélecteur CSS | .form button.primary | Les classes ou la structure changent | Un nouveau texte ou une traduction |
| XPath | //div[3]/form/button[2] | Quoi que ce soit est ajouté au-dessus ou autour | Une nouvelle classe |
| Rôle et nom accessible | role=button, name=Save | Le libellé change ou est traduit | Les refontes et les refactorings |
| Identifiant de test | data-testid=save-order | Un développeur le supprime ou le renomme | Les refontes, les traductions, les refactorings |
Chaque stratégie déplace le risque au lieu de le supprimer.
- Un rôle et un nom dépendent des mots, qui changent à chaque traduction et à chaque retouche de texte.
- Un identifiant de test dépend d'une habitude : chaque développeur doit l'ajouter, le garder et ne jamais le réutiliser, dans chaque composant, pendant toute la vie du produit.
- CSS et XPath dépendent de la structure, c'est-à-dire exactement de ce que changent les refactorings.
XPath ou sélecteur CSS est la question la plus posée, et elle compte moins qu'il n'y paraît.CSS est plus court et plus facile à lire ; XPath peut remonter dans la page et chercher un texte.Les deux décrivent la façon dont la page est construite, donc les deux cassent de la même façon.
Dans GUI Test Studio, personne ne choisit de localisateur.Un test enregistré garde de lui-même plusieurs moyens d'atteindre chaque élément, comme le montrent les sections suivantes.
L'automatisation de tests auto-réparatrice corrige-t-elle les localisateurs cassés ?
Les outils auto-réparateurs gardent des détails supplémentaires sur chaque élément pendant qu'un test réussit.Quand le localisateur principal ne correspond plus, ils cherchent l'élément avec ces détails et continuent.
L'auto-réparation est utile, avec trois limites à connaître.
Elle part toujours d'un localisateur, donc il lui faut un élément dans la page vers lequel se réparer.
Elle transforme un changement en réussite, donc chaque réparation doit être relue par une personne, sinon un vrai changement se cache derrière.
Elle ne peut rien là où il n'y a aucun élément : un canvas, un jeu, un écran distant.
Là où tout localisateur s'arrête : canvas, jeux et applications sans arbre d'accessibilité
Toutes les stratégies ci-dessus supposent que l'application décrit ses éléments.Beaucoup ne le font pas, et il n'y a aucun localisateur à écrire, bon ou mauvais.
| Application | Ce qu'un localisateur peut atteindre |
|---|---|
| Un canvas, un graphique, une carte, une scène WebGL | Un seul élément qui contient une image |
| Un jeu | Une seule fenêtre : le jeu dessine lui-même ses menus |
| Flutter sur le web | Rien tant que l'application n'active pas son accessibilité : Flutter dessine son interface sur un canvas, et son accessibilité est optionnelle sur le web |
| Qt, Java Swing, Delphi et autres applications de bureau dessinées sur mesure | Peu ou rien, selon la façon dont chaque contrôle est dessiné |
| Citrix, Bureau à distance et machines virtuelles | Une seule fenêtre de pixels sur votre ordinateur |
Pour les applications de bureau Windows, Alternatives à WinAppDriver pour les applications sans arbre d'accessibilité indique quels programmes se décrivent et lesquels ne le font pas.
Si votre test ne voit que ce que l'application décrit, une application qui ne décrit rien ne peut pas être testée.L'utilisateur, lui, voit toujours chaque bouton.
L'automatisation de tests sans sélecteurs à maintenir
GUI Test Studio, qui automatise les tests de bout en bout sur Windows, prend un autre chemin : personne n'écrit ni ne maintient de sélecteur.Vous enregistrez le test en faisant vous-même le parcours, ou vous le décrivez dans un prompt, et chaque assertion porte sur ce que voit l'utilisateur.
| L'assertion | Ce qu'elle vérifie |
|---|---|
| Assertion visuelle | Un élément est à l'écran et a l'apparence attendue : son image, trouvée et comparée |
| Assertion de texte | Un texte est à l'écran, lu là où il doit être |
| Assertion de texte dynamique | Une valeur a la bonne forme, comme une date, un montant ou un numéro de commande, quelle que soit sa valeur |
| Assertion de disposition | Les éléments sont à leur place les uns par rapport aux autres |
Pour trouver chaque élément, le GTS Engine + AI utilise deux chemins.Il interroge d'abord l'application : les informations d'accessibilité qu'une application Windows donne sur ses contrôles, ou les propres éléments d'une page web.Quand l'application ne dit rien, il trouve l'élément à vue, à l'écran.Comment GUI Test Studio trouve les éléments à l'écran explique les deux chemins en détail.
Sur une page web : plusieurs chemins vers un même élément
Pour un test web, GUI Test Studio garde plusieurs chemins vers chaque élément sur lequel il agit, classés : son identifiant de test, son identifiant, son rôle et son nom, son libellé, son texte indicatif, son texte, et sa place dans la page en dernier.Un identifiant qui semble généré par un framework est placé vers la fin de la liste, après tout ce qu'une personne peut lire.
Les chemins vers le bouton Save, essayés dans l'ordre
- 1Son identifiant de testdata-testid="save"Supprimé lors d'un refactoring
- 2Son rôle et son nomrole=button · name=SaveTrouvé
- 3Son texteSaveInutile
- 4Sa place dans la pageform > button:nth-of-type(2)Inutile
Ainsi, un identifiant de test supprimé ou une classe renommée n'arrête pas le test : le chemin suivant trouve toujours l'élément.Les mêmes chemins atteignent les éléments dans une racine shadow, et ils permettent à un test généré pour un téléphone d'ouvrir le menu qui y cache un lien.
C'est ce dernier point qui permet à un seul test web enregistré de tourner dans Chrome, Edge, Firefox et sur des téléphones émulés, comme le montrent les tests multi-navigateurs à partir d'un seul enregistrement.
Dans une application de bureau : le contrôle d'abord, puis l'écran
Dans une application Windows, une assertion faite sur un bouton garde ce que l'application a dit de ce bouton : son nom, son type, sa place.À chaque exécution, le moteur demande d'abord ce bouton à l'application en cours, et cherche son image dans le cadre que l'application donne.Parmi plusieurs boutons identiques, il prend celui qui est le plus près de la place du bouton enregistré.
Une assertion de texte demande à l'application ce que dit l'élément avant de lire les mots à l'écran, donc un mot difficile à lire à l'écran est quand même vérifié par rapport à ce que l'application dit vraiment.
Partout ailleurs : à vue
Un jeu, un canvas, une session Citrix ou un programme sans arbre d'accessibilité se teste à vue, sans rien ajouter à l'application.L'assertion cherche l'image de l'élément dans sa zone de recherche, et une assertion de texte lit les mots à l'écran.
Un tableau de bord dessine son graphique des ventes sur un canvas, donc aucun localisateur ne peut atteindre une barre ou une légende.Vous enregistrez un clic sur la barre de mars et ajoutez une assertion visuelle de la légende.Le clic est visé à travers l'image de la barre, et la légende est vérifiée telle que l'utilisateur la voit.
Ce qui se passe quand l'élément bouge ou change
Un test qui ne dépend pas d'un seul localisateur doit quand même faire face au changement.Voici ce que fait GUI Test Studio à chaque étape.
Interroger
L'application dit où est l'élément
Regarder
Ou son image est trouvée dans sa zone de recherche
Élargir
Rien : tout l'écran
Rapporter
Où il a été trouvé, et pourquoi
Chaque étape couvre un autre type de changement.
- Une fenêtre déplacée, une mise en page décalée ou une liste qui a défilé : l'application dit où est l'élément maintenant, ou son image y est trouvée.
- Un élément sorti de sa zone de recherche : quand rien n'y est trouvé, la recherche s'élargit à tout l'écran, et le rapport de confiance indique que l'élément a été trouvé hors de sa zone, avec un lien pour l'élargir.
- Un mot que la reconnaissance de texte lit mal : une assertion de texte demande à l'application ce que dit l'élément.
- Un élément web dont le premier localisateur a cassé : le chemin suivant le trouve, et l'exécution note quel chemin a changé.
Les clics suivent aussi l'élément : chaque clic est visé à travers l'assertion qui le précède, donc quand le bouton bouge, le clic bouge avec lui.Voir les assertions visuelles et les assertions de texte pour le réglage de chaque assertion.
Ce qui demande encore votre décision
Aucune approche ne rend chaque changement gratuit.Voici les cas où une personne décide.
| Situation | Que faire |
|---|---|
| L'apparence d'un élément a changé volontairement | L'assertion échoue avec l'image attendue et l'image obtenue côte à côte.Cliquez sur Accepter le résultat obtenu comme attendu dans le rapport de confiance et enregistrez. |
| La taille d'écran ou la mise à l'échelle diffère de l'enregistrement | Une assertion à vue compare des images, donc exécutez avec la même taille d'écran et la même mise à l'échelle, ou gardez un profil de référence pour chacune. |
| L'application ne démarre pas là où l'enregistrement a commencé | Remettez l'application dans l'état où l'enregistrement a commencé : la même page, les mêmes données, les mêmes fenêtres ouvertes. |
| Un test A/B sert une autre variante | Fixez la variante dans votre environnement de test, ou gardez un profil de référence pour chaque variante. |
| L'élément a vraiment disparu | C'est une anomalie.Le test échoue, et le rapport montre ce qui était attendu, et où. |
Accepter une nouvelle apparence détaille la mise à jour en un clic, et tests instables et faux positifs explique comment une assertion distingue un bruit sans conséquence d'un vrai changement.
Pour les anomalies visuelles qu'une assertion fondée sur un localisateur laisse passer sans les voir, lisez les anomalies visuelles que vos tests automatisés ne voient pas.
Points clés
- 1« Element not found » est en général un problème de test, pas une anomalie : le localisateur, le moment ou le contexte est faux plus souvent que l'application.
- 2Les localisateurs cassent pour des raisons ordinaires : identifiants générés, refontes, tests A/B, traductions, shadow DOM, iframes et listes virtualisées.
- 3Chaque stratégie déplace le risque : CSS et XPath dépendent de la structure, les rôles et les noms des mots, les identifiants de test d'une habitude d'équipe, l'auto-réparation d'une relecture.
- 4Certaines applications ne donnent rien à un localisateur : canvas, jeux, sessions Citrix et applications sans arbre d'accessibilité ne se testent qu'à vue.
- 5GUI Test Studio n'a ni sélecteurs ni localisateurs à maintenir : il interroge d'abord l'application, trouve l'élément à vue quand l'application ne dit rien, et vérifie ce que voit l'utilisateur.
Questions
Que signifie « element not found » en automatisation de tests ?
Cela signifie que le test a demandé un élément avec un localisateur, comme un identifiant, un sélecteur CSS ou un XPath, et que rien dans la page n'y a correspondu à temps.Dans Selenium, cela apparaît comme NoSuchElementException, dans Playwright comme un dépassement de délai.L'élément peut manquer, mais le plus souvent c'est le localisateur, le moment ou le contexte qui est faux.
Pourquoi mon test trouve-t-il l'élément en local mais pas en CI ?
En général parce que l'exécution est différente, pas le code.Un agent de build plus lent affiche l'élément plus tard que votre portable, un écran plus petit le cache derrière un menu, d'autres données de test changent son texte, ou un test A/B sert une autre variante.Regardez la capture d'écran ou la vidéo de l'exécution en échec avant de changer le localisateur.
Vaut-il mieux XPath ou un sélecteur CSS ?
Aucun n'est sûr à lui seul.Les deux décrivent la construction de la page, donc les deux cassent quand sa structure change, comme le prévient la documentation de Playwright.Un rôle et un nom ou un identifiant de test durent plus longtemps, mais chacun s'écrit et se tient à jour à la main.Dans GUI Test Studio, personne n'écrit ni l'un ni l'autre : le test garde ses propres moyens d'atteindre chaque élément.
Comment gérer les identifiants dynamiques dans Selenium ou Playwright ?
N'y construisez pas de test : un identifiant qui change à chaque build ou à chaque chargement de page ne peut pas trouver deux fois le même élément.Dans un test codé, cela veut dire écrire et entretenir un autre localisateur à la main.Dans GUI Test Studio, il n'y a rien à écrire : un test web place un identifiant qui semble généré en fin de sa liste de moyens d'atteindre l'élément, après tout ce qu'une personne peut lire.
L'automatisation de tests auto-réparatrice fonctionne-t-elle ?
Elle aide quand un attribut change et que l'élément est toujours là.Elle ne peut pas retrouver un élément qui a vraiment disparu, et elle part toujours d'un localisateur que quelqu'un a écrit et doit entretenir.Vérifiez chaque réparation, sinon elle peut cacher un vrai changement.
Comment tester une application qui n'a pas d'arbre d'accessibilité ?
Testez-la à vue, à l'écran.Les jeux, les canvas, les graphiques, les sessions Citrix et Bureau à distance et beaucoup de programmes dessinés sur mesure n'exposent rien qu'un localisateur puisse atteindre.GUI Test Studio trouve leurs éléments par leur image et vérifie le texte lu à l'écran, sans rien changer à l'application.
Peut-on automatiser des tests de bout en bout sans sélecteurs ni localisateurs ?
Oui.Dans GUI Test Studio, vous enregistrez un test ou le décrivez dans un prompt, et il n'y a ni sélecteurs ni localisateurs à maintenir.Chaque assertion est une image, un texte, la forme d'une valeur ou une disposition à l'écran, et le GTS Engine + AI trouve chaque élément en interrogeant d'abord l'application, et à vue quand elle ne dit rien.
Que se passe-t-il quand un bouton change volontairement ?
L'assertion échoue et montre l'image attendue et l'image obtenue côte à côte.Si le changement est voulu, cliquez sur Accepter le résultat obtenu comme attendu dans le rapport de confiance et enregistrez : le test est à jour, sans code à modifier.
Selenium, Playwright, Cypress, AG Grid, Flutter, Qt, Java, Delphi, Citrix, Chrome, Edge, Firefox et Windows sont des marques de leurs propriétaires respectifs.
À lire aussi
Tous les articles
Fiabilité des tests
Tests instables : causes, coûts et comment arrêter les faux positifs
12 min de lecture

Tests visuels
Test de captures d'écran au pixel près : pourquoi il échoue, et ce qui détecte les vrais bugs visuels
12 min de lecture

Automatisation des tests
Tests manuels ou tests automatisés : pourquoi les tests manuels ne suffisent pas pour les tests de bout en bout
15 min de lecture