Tests automatisés avec Selenium et Python : de la théorie à la pratique
Par Gildas Tema
La réalité des tests manuels
Les tests manuels ont un coût caché exponentiel : plus votre application grossit, plus le temps de régression augmente. Un simple sprint peut générer 50 nouveaux scénarios à retester à chaque release. À 15 minutes par scénario, c’est 12 heures de tests répétitifs à chaque déploiement, autant d’heures soustraites à des tâches à valeur ajoutée.
L’automatisation des tests n’est pas un luxe : c’est un investissement avec un ROI mesurable.
Pourquoi Selenium + Python ?
Selenium est le standard industrie pour l’automatisation des navigateurs web : open source, multi-browser (Chrome, Firefox, Edge), et supporté par une communauté massive.
Python s’impose comme langage de choix pour la QA grâce à :
- Sa lisibilité : les tests sont compréhensibles même par des non-développeurs
- L’écosystème riche (
pytest,selenium,requests,faker) - La rapidité de développement
Installation et configuration
pip install selenium pytest pytest-html webdriver-manager
Utilisez webdriver-manager pour gérer automatiquement les versions de ChromeDriver :
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
def get_driver():
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
service = Service(ChromeDriverManager().install())
return webdriver.Chrome(service=service, options=options)
Le Pattern Page Object Model
Le POM est LA bonne pratique incontournable pour des tests maintenables. L’idée : encapsuler les sélecteurs et actions dans des classes représentant des pages.
# pages/login_page.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class LoginPage:
URL = "https://app.monsite.fr/login"
# Locators
EMAIL_INPUT = (By.ID, "email")
PASSWORD_INPUT = (By.ID, "password")
SUBMIT_BTN = (By.CSS_SELECTOR, "button[type='submit']")
ERROR_MSG = (By.CLASS_NAME, "alert-error")
def __init__(self, driver):
self.driver = driver
self.wait = WebDriverWait(driver, 10)
def navigate(self):
self.driver.get(self.URL)
return self
def login(self, email: str, password: str):
self.wait.until(EC.presence_of_element_located(self.EMAIL_INPUT))
self.driver.find_element(*self.EMAIL_INPUT).send_keys(email)
self.driver.find_element(*self.PASSWORD_INPUT).send_keys(password)
self.driver.find_element(*self.SUBMIT_BTN).click()
return self
def get_error_message(self) -> str:
element = self.wait.until(EC.visibility_of_element_located(self.ERROR_MSG))
return element.text
# tests/test_login.py
import pytest
from pages.login_page import LoginPage
class TestLogin:
def test_login_succes(self, driver):
page = LoginPage(driver).navigate()
page.login("user@test.fr", "password123")
assert "/dashboard" in driver.current_url
def test_login_mauvais_mdp(self, driver):
page = LoginPage(driver).navigate()
page.login("user@test.fr", "mauvais_mdp")
assert "Identifiants incorrects" in page.get_error_message()
def test_login_email_vide(self, driver):
page = LoginPage(driver).navigate()
page.login("", "password123")
# HTML5 validation — pas de navigation
assert page.URL in driver.current_url
Intégration dans GitLab CI
test:selenium:
stage: test
image: python:3.12
services:
- name: selenium/standalone-chrome:latest
alias: selenium
variables:
SELENIUM_HOST: selenium
SELENIUM_PORT: "4444"
script:
- pip install -r requirements-test.txt
- pytest tests/selenium/ -v --html=reports/selenium.html
artifacts:
when: always
paths: [reports/]
reports:
junit: reports/junit.xml
expire_in: 1 week
Le service selenium/standalone-chrome (image Docker officielle) lance Chrome dans le CI sans configuration supplémentaire.
Métriques de qualité à suivre
| Métrique | Objectif | Outil |
|---|---|---|
| Couverture des user stories | ≥ 80% | Jira / Notion |
| Taux de flakiness | < 2% | Rapport pytest-html |
| Temps d’exécution | < 10 min | GitLab pipeline |
| Taux de réussite baseline | > 95% | GitLab CI |
Conclusion
L’automatisation des tests avec Selenium et Python est accessible à toute équipe. La barrière d’entrée est bien plus basse qu’on ne l’imagine. Le POM garantit des tests maintenables sur le long terme, et l’intégration CI/CD permet de détecter les régressions dans les minutes suivant un push.
Chez aCloud.Digital, la QA automatisée fait partie intégrante de toutes nos missions de conseil. Découvrez notre service QA & Testing ou contactez-nous pour un audit de vos pratiques de test actuelles.