Selenium WebDriver est un outil incontournable pour l'automatisation des tests web. Il permet de simuler les interactions d'un utilisateur réel avec un navigateur de manière programmatique.
Mise en place de Selenium IDE
Avant de plonger dans le code, Selenium IDE est une extension de navigateur utile pour enregistrer et reproduire des scénarios simples. Elle est disponible sur les catalogues d'extensions de Chrome et Firefox.
- Recherchez "Selenium IDE" dans le store de votre navigateur.
- Installez l'extension.
- L'icône Selenium apparaîtra dans votre barre d'outils, prête pour l'enregistrement de scripts sans code.
Configuration du WebDriver
Pour piloter un navigateur, Selenium nécessite un exécutable spécifique (GeckoDriver pour Firefox, ChromeDriver pour Chrome). Si le driver n'est pas dans votre variable d'environnement PATH, vous devez spécifier son chemin localement.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# Définition du chemin vers le driver local
service_chrome = Service(executable_path='/votre/chemin/chromedriver.exe')
navigateur = webdriver.Chrome(service=service_chrome)
navigateur.get('https://www.wikipedia.org')
navigateur.quit()
Interactions élémentaires avec les pages Web
Une fois le navigateur lancé, l'essentiel du travail cosniste à localiser des éléments et à interagir avec eux (clics, saisies, lectures).
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
instance_web = webdriver.Chrome()
try:
instance_web.get('https://duckduckgo.com')
# Localisation du champ de recherche par son sélecteur ID ou Nom
champ_saisie = instance_web.find_element(By.ID, 'search_form_input_homepage')
# Simulation de la saisie utilisateur
champ_saisie.send_keys('Automatisation Selenium')
time.sleep(1)
# Simulation du clic sur le bouton de recherche
bouton_valider = instance_web.find_element(By.ID, 'search_button_homepage')
bouton_valider.click()
# Récupération d'informations sur la page
print(f"Titre de la page : {instance_web.title}")
print(f"URL actuelle : {instance_web.current_url}")
finally:
time.sleep(5)
instance_web.quit()
Stratégies de localisation des éléments
Selenium propose plusieurs méthodes pour cibler des balises HTML au sein du DOM. L'utilisation de la classe By est la méthode recommandée pour sa clarté.
By.ID: Recherche par l'identifiant unique.By.NAME: Recherche par l'attribut name.By.CLASS_NAME: Recherche par classe CSS.By.XPATH: Utilisation de requêtes XPath pour des structures complexes.By.CSS_SELECTOR: Utilisation de sélecteurs CSS standards.By.LINK_TEXT: Recherche de liens par leur texte visible.
Gestion des fenêtres et navigation
Le pilotage enclut également la gestion du cycle de vie du navigateur : redimensionnement, navigation dans l'historique et captures d'écran.
# Gestion du navigateur
navigateur.maximize_window() # Plein écran
navigateur.refresh() # Actualiser la page
navigateur.back() # Page précédente
navigateur.forward() # Page suivante
# Capture d'écran pour le débogage
navigateur.save_screenshot('capture_erreur.png')
Utilisation des attentes explicites (WebDriverWait)
Le Web moderne étant asynchrone, il est crucial d'attendre que les éléments soient chargés avant d'interagir. La classe WebDriverWait associée à expected_conditions (EC) permet d'éviter les erreurs de type 'élément introuvable'.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Attendre au maximum 15 secondes qu'un élément soit cliquable
attente = WebDriverWait(navigateur, 15)
element_dynamique = attente.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-submit')))
element_dynamique.click()
Actions avancées et exécution de JavaScript
Parfois, les méthodes standards de Selenium ne suffisent pas, notamment pour des menus contextuels ou des défilements complexes. On utilise alors ActionChains ou l'exécution directe de scripts JavaScript.
from selenium.webdriver import ActionChains
# Simulation d'un survol de souris (Hover)
actions = ActionChains(navigateur)
menu = navigateur.find_element(By.ID, 'menu-principal')
actions.move_to_element(menu).perform()
# Exécution de JavaScript pour scroller en bas de page
navigateur.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Affichage d'une alerte personnalisée
navigateur.execute_script("alert('Action terminée avec succès');")
Récupération des attributs et propriétés CSS
Il est possible d'extraire n'miporte quelle donnée d'un élément après l'avoir localisé, ce qui est utile pour les assertions dans les tests automatisés.
objet_lien = navigateur.find_element(By.TAG_NAME, 'a')
print(objet_lien.get_attribute('href')) # Récupérer l'URL du lien
print(objet_lien.text) # Récupérer le texte visible
print(objet_lien.value_of_css_property('color')) # Vérifier la couleur CSS