Les cas difficiles : éléments dynamiques, iframes, uploads & simulation réseau
C'est les derniers 20% des vraies apps — les bouts délicats où les débutants se coincent. Bonne nouvelle : quatre motifs gèrent presque tout.
L'idée, en une ligne
Les éléments qui apparaissent tard, les iframes, les uploads de fichiers, et les fausses réponses réseau ont chacun une réponse propre et intégrée dans Playwright.
Les quatre motifs
- Les éléments dynamiques qui apparaissent tard n'ont besoin d'aucun sleep. Un sélecteur plus
expect(...).to_be_visible()réessaie automatiquement jusqu'à ce que l'élément arrive ou expire. - Les iframes sont des documents séparés. Atteignez l'intérieur avec
page.frame_locator("iframe#pay").get_by_role(...)— vous chaînez à travers la frame au lieu d'utiliser la page brute. - Les uploads de fichiers sautent complètement la boîte de dialogue de l'OS : ciblez le
<input type=file>et appelezlocator.set_input_files("invoice.pdf"). Passez une liste pour plusieurs fichiers, ou[]pour vider. - La simulation réseau est le super-pouvoir — la prochaine section lui est entièrement consacrée.
Avancé — simuler le réseau avec page.route
Avec page.route(pattern, handler) vous interceptez une requête et y répondez vous-même avec route.fulfill(json=...). Renvoyez un catalogue fixe, forcez un 500 pour tester votre écran d'erreur, ou route.abort() pour faire croire que le backend est mort.
Voyez-le à l'œuvre
from playwright.sync_api import Page, Route, expect
def test_error_banner_on_500(page: Page):
# Force the products API to fail, then check the UI copes
def fail(route: Route):
route.fulfill(status=500, json={"error": "down"})
page.route("**/api/v1/products", fail)
page.goto("https://demo.playwright.dev/api-mocking")
expect(page.get_by_text("Something went wrong")).to_be_visible()
def test_upload(page: Page):
page.goto("https://the-internet.herokuapp.com/upload")
page.locator("#file-upload").set_input_files("invoice.pdf")
page.get_by_role("button", name="Upload").click()
expect(page.get_by_text("File Uploaded!")).to_be_visible()Lisez-le de haut en bas : le premier test dit à l'appel des produits d'échouer, puis confirme que le message d'erreur s'affiche. Le second uploade un fichier directement dans l'input et vérifie que ça a réussi.
Basé sur la doc officielle Playwright (Python) — Frames, File Uploads, Mock APIs
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