Playwright
L'alternative moderne à Selenium, créée par Microsoft. Pilote Chromium, Firefox et WebKit avec une seule API, gère l'attente des éléments automatiquement, et installe ses navigateurs tout seul.
À quoi ça sert
Playwright fait exactement la même chose que Selenium : piloter un navigateur depuis Python pour scraper des pages dynamiques (qui dépendent du JavaScript) ou tester une application web de bout en bout. Mais sa conception, plus récente (2020), règle plusieurs irritants historiques de Selenium.
Les trois grosses différences que tu vas sentir tout de suite :
- Auto-wait intégré — Playwright attend automatiquement qu'un élément soit visible et cliquable avant de cliquer dessus. Plus besoin de
WebDriverWaitmanuel partout. - Une seule API pour 3 navigateurs — Chromium, Firefox et WebKit (le moteur de Safari). Tu changes une ligne pour passer de l'un à l'autre.
- Installation des navigateurs gérée — une commande
playwright installtélécharge les bons binaires en cache local. Pas besoin que Chrome soit installé sur la machine.
L'API se décline en deux versions : synchrone (la plus simple, qu'on
utilise dans les exemples ici) et asynchrone (basée sur
asyncio, utile pour scraper plusieurs pages en parallèle).
Playwright = Selenium en plus simple, plus rapide et plus stable, avec auto-wait et installation des navigateurs intégrée.
Si tu rejoins un projet existant qui utilise Selenium, ou si tu suis un cours / tuto basé sur Selenium, reste sur Selenium. Pour démarrer un nouveau projet de scraping en 2026, Playwright est généralement le meilleur choix.
Un exemple d'usage
Même cas que la fiche Selenium : récupérer les citations de
quotes.toscrape.com/js/
(contenu chargé en JavaScript). Compare le code avec celui de
Selenium — c'est plus court, sans WebDriverWait,
et le navigateur est géré tout seul :
from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://quotes.toscrape.com/js/")
# Auto-wait : on attend que le 1er .quote soit visible
page.locator(".quote").first.wait_for()
soup = BeautifulSoup(page.content(), "html.parser")
for bloc in soup.select(".quote"):
texte = bloc.select_one(".text").get_text(strip=True)
auteur = bloc.select_one(".author").get_text(strip=True)
print(f"{auteur} — {texte}")
browser.close()
Le with sync_playwright() gère le démarrage et la fermeture proprement —
pas besoin de try / finally comme en Selenium. Et browser.close()
suffit pour tout nettoyer.
How-to : installer et utiliser Playwright
-
Installer Playwright dans un venv
bashpython3 -m venv .venv source .venv/bin/activate pip install playwright beautifulsoup4 -
Télécharger les navigateurs
Étape spécifique à Playwright : la lib est installée, mais il faut une commande de plus pour récupérer les binaires des navigateurs (Chromium, Firefox, WebKit) en cache local.
bash# Télécharger les 3 navigateurs (~500 Mo) playwright install # Ou seulement Chromium si ça suffit (~150 Mo) playwright install chromiumUne fois fait, tout est en cache et tu n'as plus besoin de Chrome ni Firefox installés sur ta machine — Playwright utilise ses propres binaires. Tu peux supprimer cette dépendance plus tard avec
playwright uninstall. -
Premier script : ouvrir une page
pythonfrom playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("https://quotes.toscrape.com/js/") print(page.title()) browser.close()Par défaut, Playwright tourne en headless (pas de fenêtre). Pour voir ce qui se passe pendant le développement, passe
headless=False. -
Sélectionner avec
locatorLe locator est le concept central de Playwright. Contrairement à
find_elementde Selenium qui te renvoie immédiatement un élément (ou lève une exception), un locator est une description de l'élément : il ne touche le DOM qu'au moment où tu l'utilises, et il ré-évalue la sélection à chaque fois.python# Sélecteurs CSS quotes = page.locator(".quote") print(quotes.count()) # nombre d'éléments # Le 1er match premier = quotes.first # Sélection par texte (très lisible, recommandé par la doc) bouton = page.get_by_text("Suivant") champ = page.get_by_role("textbox", name="Email") -
Auto-wait : la grosse différence avec Selenium
Quand tu fais
locator.click(), Playwright attend automatiquement que l'élément soit : présent dans le DOM, visible, stable (pas en cours d'animation), et activé. Pas deWebDriverWaità écrire.python# Cliquer sur un bouton — l'attente est automatique page.get_by_text("Suivant").click() # Attendre explicitement qu'un élément apparaisse page.locator(".quote").first.wait_for() # Attendre une URL précise page.wait_for_url("**/page/2/")Tu peux quand même attendre explicitement avec
locator.wait_for()quand tu veux te synchroniser sur l'apparition d'un élément avant de lire le HTML. -
Interagir avec la page
python# Remplir un champ page.get_by_role("textbox", name="Email").fill("a@b.fr") # Cliquer page.get_by_role("button", name="Connexion").click() # Lire le texte d'un élément texte = page.locator("h1").text_content() # Lire un attribut href = page.locator("a.next").get_attribute("href") # Capture d'écran page.screenshot(path="page.png") -
Combiner avec BeautifulSoup
Comme avec Selenium, on peut laisser Playwright charger la page puis donner le HTML rendu à BeautifulSoup pour le parsing massif :
pythonfrom bs4 import BeautifulSoup page.goto(url) page.locator(".quote").first.wait_for() soup = BeautifulSoup(page.content(), "html.parser") for bloc in soup.select(".quote"): ...page.content()renvoie le HTML rendu (équivalent dedriver.page_sourceen Selenium). -
Bonus : enregistrer un script via
codegenPlaywright propose une commande qui ouvre un navigateur, enregistre tes clics et tes saisies, et te génère le code Python correspondant. Très pratique pour démarrer ou pour comprendre comment cibler un élément.
bashplaywright codegen https://quotes.toscrape.com/js/
Aide-mémoire
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# Lancer un navigateur
browser = p.chromium.launch(headless=True)
# p.firefox.launch() / p.webkit.launch() au choix
# Page
page = browser.new_page()
page.goto(url)
page.title()
page.content() # HTML rendu (à passer à BS4)
# Locators (description, pas un élément immédiat)
page.locator(".quote")
page.get_by_text("Suivant")
page.get_by_role("button", name="OK")
# Actions (auto-wait inclus)
locator.click()
locator.fill("texte")
locator.text_content()
locator.get_attribute("href")
locator.count()
locator.first, locator.last
locator.wait_for() # attente explicite
# Divers
page.screenshot(path="x.png")
page.wait_for_url("**/page/2/")
browser.close()
# En CLI
# playwright install (télécharger les navigateurs)
# playwright codegen <url> (enregistrer un script à la souris)
Pour aller plus loin
- Documentation officielle : playwright.dev/python
- Site d'entraînement (version JS) : quotes.toscrape.com/js/
- Pour parser le HTML récupéré : fiche BeautifulSoup.
- Comparer avec l'historique : fiche Selenium.