Aller au contenu principal
QA & Testing

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étriqueObjectifOutil
Couverture des user stories≥ 80%Jira / Notion
Taux de flakiness< 2%Rapport pytest-html
Temps d’exécution< 10 minGitLab 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.