Le Page Object Model, fait correctement
Une fois que vous avez plus d'une poignée de tests, ils commencent à s'éparpiller. Ce motif les garde bien rangés — et c'est exactement la structure que les examinateurs espèrent voir.
Le problème, en une ligne
Quand les sélecteurs sont copiés-collés à travers de nombreux tests, un seul bouton renommé casse vingt fichiers. C'est une taxe de maintenance dont vous ne voulez pas.
L'idée, en une ligne
Le Page Object Model donne à chaque page (ou composant) une classe qui possède ses sélecteurs et offre des actions en langage clair. Les tests appellent les actions et ne touchent jamais un sélecteur brut.
Où tracer la ligne
- Un page object tient les sélecteurs et les actions comme
login(user, pw)ouadd_first_item(). Il renvoie des données ou la page suivante — et ne contient aucune assertion. - Un test tient le scénario et les assertions. Il appelle
login(), puis vérifie le résultat. - Un helper est tout ce qui est réutilisé à travers plusieurs pages — un générateur d'email aléatoire, un appel d'ensemencement d'API. Ce n'est pas une page.
Gardez les méthodes au niveau de l'utilisateur. Un test devrait se lire comme cart.add_first_item(), jamais un sélecteur brut. Quand l'UI change, vous éditez une méthode dans une classe et chaque test continue de passer.
Voyez-le à l'œuvre
# pages/login_page.py — locators + actions, NO assertions
from playwright.sync_api import Page
class LoginPage:
def __init__(self, page: Page):
self.page = page
self.username = page.get_by_placeholder("Username")
self.password = page.get_by_placeholder("Password")
self.login_btn = page.get_by_role("button", name="Login")
def load(self):
self.page.goto("https://www.saucedemo.com/")
def login(self, user: str, pw: str):
self.username.fill(user)
self.password.fill(pw)
self.login_btn.click()
# test_login.py — scenario + assertions live here
from playwright.sync_api import expect
from pages.login_page import LoginPage
def test_valid_login(page):
login = LoginPage(page)
login.load()
login.login("standard_user", "secret_sauce")
expect(page.get_by_text("Products")).to_be_visible()Lisez-le de haut en bas : la classe page sait où sont les champs et comment se connecter. Le test dit juste « charge, connecte-toi, et vérifie que j'ai atterri sur Products ». Propre et facile à lire.
Avancé — c'est ainsi que les frameworks passent à l'échelle
Basé sur la doc officielle Selenium (Page Object Models) et le guide POM de Playwright
Toutes les leçons de Automatisation UI : Selenium + Playwright + pytest
- Sélecteurs Selenium : trouver l'élément que vous voulez
- Attentes, actions & frames — tuer l'instabilité à la source
- Playwright : attente automatique, sélecteurs & tracing
- pytest en profondeur : fixtures, conftest, parametrize & marqueurs
- Le Page Object Model, fait correctement
- Les cas difficiles : éléments dynamiques, iframes, uploads & simulation réseau