À 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 WebDriverWait manuel 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 install té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).

En une phrase

Playwright = Selenium en plus simple, plus rapide et plus stable, avec auto-wait et installation des navigateurs intégrée.

Quand préférer Selenium

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 :

python
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

  1. Installer Playwright dans un venv

    Avec pip (ou UV) :

    bash
    python3 -m venv .venv
    source .venv/bin/activate
    pip install playwright beautifulsoup4
  2. 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 chromium

    Une 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.

  3. Premier script : ouvrir une page

    python
    from 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.

  4. Sélectionner avec locator

    Le locator est le concept central de Playwright. Contrairement à find_element de 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")
  5. 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 de WebDriverWait à é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.

  6. 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")
  7. Combiner avec BeautifulSoup

    Comme avec Selenium, on peut laisser Playwright charger la page puis donner le HTML rendu à BeautifulSoup pour le parsing massif :

    python
    from 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 de driver.page_source en Selenium).

  8. Bonus : enregistrer un script via codegen

    Playwright 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.

    bash
    playwright codegen https://quotes.toscrape.com/js/

Aide-mémoire

python
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