Dans l'automatisation des tests web avec Selenium et Python, la localisation précise des éléments constitue une compétence fondamentale. Ce guide présente les techniques principales pour identifier des éléments dans le DOM.
Stratégies de localisation disponibles
- Par ID : Exploite l'attribut id unique de l'élément
- Par nom : Utilise l'attribut name pour les fromulaires
- Par classe : Se base sur l'attribut class des éléments
- Par balise : Cible le type de balise HTML (input, button, etc.)
- Par texte de lien complet : Repère un lien par son texte visible intégral
- Par texte partiel : Localise via un fragment du texte d'un lien
- Par expression XPath : Navigate DOM avec des chemins structurés
- Par sélecteur CSS : Applique des sélecteurs standards CSS
- Par classe By : Approche unifiée recommandée dans Selenium moderne
Mise en pratique avec exemples de code
Les exemples suivants démontrent chaque méthode en utilisant la syntaxe By, considérée comme la meilleure pratique actuelle.
1. Localisation via ID
from selenium import webdriver
from selenium.webdriver.common.by import By
# Configuration du pilote
pilote_navigation = webdriver.Chrome()
pilote_navigation.maximize_window()
# Accès à une page exemple
pilote_navigation.get('https://www.siteweb-demo.com')
# Tentative de localisation par ID
try:
champ_recherche = pilote_navigation.find_element(By.ID, 'identifiant_recherche')
champ_recherche.saisir('test')
print('Succès : élément localisé par ID')
except Exception as erreur:
print('Échec de la localisation par ID')
2. Localisation via attribut name
from selenium import webdriver
from selenium.webdriver.common.by import By
pilote = webdriver.Chrome()
pilote.get('https://www.siteweb-demo.com')
# Recherche par attribut name
try:
champ_formulaire = pilote.find_element(By.NAME, 'nom_champ')
champ_formulaire.saisir('données')
print('Localisation par name réussie')
except:
print('Erreur dans la localisation par name')
3. Localisation via classe CSS
from selenium import webdriver
from selenium.webdriver.common.by import By
navigateur = webdriver.Chrome()
navigateur.get('https://www.exemple.com')
# Identification par classe
try:
bouton = navigateur.find_element(By.CLASS_NAME, 'classe-bouton')
bouton.cliquer()
print('Élément ciblé via classe')
except:
print('Impossible de localiser par classe')
4. Localisation par type de balise
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('https://www.test-page.com')
# Repérage par balise
try:
formulaire = driver.find_element(By.TAG_NAME, 'formulaire')
print('Formulaire détecté')
except:
print('Échec de la détection par balise')
5. Localisation par texte de lien
from selenium import webdriver
from selenium.webdriver.common.by import By
session = webdriver.Chrome()
session.get('https://www.portail.com')
# Ciblage par texte complet du lien
try:
lien = session.find_element(By.LINK_TEXT, 'Texte exact du lien')
lien.cliquer()
print('Lien activé avec succès')
except:
print('Lien non trouvé')
6. Localisation par fragment de texte
from selenium import webdriver
from selenium.webdriver.common.by By
navigateur_web = webdriver.Chrome()
navigateur_web.get('https://www.site.fr')
# Recherche partielle dans le texte des liens
try:
element_lien = navigateur_web.find_element(By.PARTIAL_LINK_TEXT, 'fragment')
element_lien.cliquer()
print('Lien partiel localisé')
except:
print('Aucun lien correspondant')
7. Localisation via XPath
from selenium import webdriver
from selenium.webdriver.common.by import By
pilote_auto = webdriver.Chrome()
pilote_auto.get('https://www.application.com')
# Expression XPath pour localisation précise
try:
cible = pilote_auto.find_element(By.XPATH, "//input[@data-role='saisie']")
cible.saisir('contenu')
print('XPath : élément trouvé')
except:
print('Échec avec XPath')
8. Localisation via sélecteur CSS
from selenium import webdriver
from selenium.webdriver.common.by import By
session_navigateur = webdriver.Chrome()
session_navigateur.get('https://www.exemple.fr')
# Sélecteur CSS avancé
try:
zone_texte = session_navigateur.find_element(By.CSS_SELECTOR, '#identifiant.special')
zone_texte.saisir('texte entré')
print('Sélecteur CSS fonctionnel')
except:
print('Problème avec le sélecteur CSS')
Causes fréquentes d'échec de localisation
- Élément absent du DOM au moment de la recherche
- Attributs dynamiques ou instables
- Présence d'iframes nécessitant un changement de contexte
- Problèmes de synchronisation ou d'attente
- Erreurs dans la syntaxe des expressions XPath ou CSS