L'automazione del browser in Python: Playwright, Selenium e altro ancora

Confronto tra l'automazione del browser in Python e i test E2E.

Indice

Scegliere lo stack giusto per l’automazione del browser in Python influisce sulla velocità, sulla stabilità e sulla manutenzione. Questo riepilogo confronta Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge - con un focus su Python, notando dove Node.js o altri linguaggi si adattano.

Playwright trace viewer Ecco una schermata del Playwright trace viewer

Quando utilizzare quale

Playwright (Python)
Playwright è una libreria open source per l’automazione del browser di Microsoft. Comunica con Chromium, Firefox e WebKit tramite il Chrome DevTools Protocol (CDP) o WebSocket, quindi si ottiene un’unica API per tutti e tre i motori. Viene fornito con auto-waiting: prima di ogni azione (click, compilazione, ecc.) aspetta che l’elemento sia visibile, stabile e azionabile, riducendo la fragilità e la necessità di utilizzare manualmente sleep o WebDriverWait. L’installazione è minimale (pip install playwright quindi playwright install), e l’API Python è di prima classe (sincrona e asincrona). Utilizzalo per nuovi set di test E2E, scripting o automazione (es. costruzione di server MCP in Python che guidano un browser). Per un tutorial completo con esempi in Python, JavaScript e TypeScript, vedi Playwright: Web Scraping & Testing. Combinalo con test unitari in Python per il resto dell’app e utilizza Playwright solo per il livello del browser. Svantaggi: più recente di Selenium, quindi meno integrazioni di terze parti e meno materiali obsoleti; nessun supporto ufficiale per i browser molto vecchi.

Selenium (Python)
Selenium è lo standard consolidato per l’automazione del browser. Il progetto Selenium (open source, sostenuto dalla OpenJS Foundation) fornisce l’API WebDriver: invii comandi a un driver specifico del browser (ChromeDriver, GeckoDriver, ecc.), che comunica con il browser reale. Selenium supporta molti linguaggi (Python, Java, C#, JavaScript, ecc.) e la gamma più ampia di browser, incluso quelli obsoleti. Selenium 4+ include Selenium Manager, quindi non è più necessario scaricare o aggiungere manualmente i binari del driver - il client scarica automaticamente il driver giusto per te. L’API non auto-wait; tipicamente si utilizza WebDriverWait e condizioni attese per evitare test instabili. Utilizza Selenium quando mantieni i set di test WebDriver esistenti, hai bisogno dell’ecosistema più ampio e del supporto linguistico, o devi supportare i browser più vecchi. Si adatta ai pattern di progettazione Python per l’architettura pulita quando si avvolge il driver dietro un piccolo adattatore. Svantaggi: generalmente più lento e più fragile di Playwright senza una strategia di attesa attenta; più codice boilerplate.

Puppeteer
Puppeteer è la libreria Node.js di Google per il controllo di Chrome/Chromium (e Edge basato su Chromium). Utilizza direttamente il Chrome DevTools Protocol e è l’opzione di default per i team JavaScript/TypeScript che fanno automazione solo su Chrome, generazione di PDF o scraping in Node. Non esiste nessuna binding ufficiale per Python; l’API è solo per Node. Se il tuo stack è Python, utilizza Playwright (stessa idea di “controllo CDP” con API Python di prima classe) o Selenium. Se sei in Node.js e hai bisogno solo di Chromium, Puppeteer è un’opzione forte e ben documentata. Svantaggi: solo Chrome/Chromium; nessun Firefox o WebKit; nessun Python.

LambdaTest
LambdaTest è una piattaforma commerciale di test cloud. Continui a scrivere gli stessi script Selenium o Playwright (o Cypress, ecc.) localmente, ma invece di lanciare un browser locale ti connetti alla griglia di LambdaTest. Forniscono browser reali e dispositivi reali (inclusi mobili) in cloud, quindi puoi eseguire test in parallelo su molte combinazioni di OS/browser/versione senza dover gestire il tuo laboratorio. Otterrai un dashboard per i risultati, i video e i log. Utilizzalo quando hai bisogno di copertura cross-browser, esecuzione parallela su larga scala o emulazione mobile e non vuoi ospitare l’infrastruttura. Supporta anche Gauge: esegui i tuoi test Gauge sulla griglia Selenium di LambdaTest. Svantaggi: pagato (con livelli gratuiti); i test vengono eseguiti su rete, quindi latenza e disponibilità dipendono dal loro servizio.

ZenRows
ZenRows è un servizio commerciale di scraping e anti-detection. Il browser di scraping è un browser cloud che controlli tramite Playwright (o altri strumenti compatibili con CDP): connetti il tuo script a un endpoint WebSocket e il browser esegue su ZenRows con proxy residenziali, rotazione IP, bypass anti-bot (es. Cloudflare, DataDome) e gestione opzionale di CAPTCHA. Non devi modificare la logica di Playwright - solo l’endpoint del browser. Utilizzalo quando il tuo obiettivo è lo scraping e incontri blocchi o limiti di velocità; per test E2E normali sul tuo app, il Playwright o Selenium locale è di solito sufficiente. Svantaggi: pagato; mirato allo scraping, non a griglie di test generali come LambdaTest.

Gauge
Gauge è un framework open source per i test di Thoughtworks. Si concentra su specifiche e reporting: scrivi le specifiche in Markdown (o altri formati) con scenari e passaggi, e implementa i passaggi in Python (o Java, JavaScript, ecc.) utilizzando Selenium o qualsiasi altro driver per guidare il browser. Gauge non sostituisce Selenium o Playwright; si posiziona sopra di loro e aggiunge struttura, riutilizzo e report leggibili. Utilizzalo quando desideri specifiche BDD, documentazione vivente e report chiari sopra la tua configurazione esistente di Selenium (o simile). LambdaTest supporta l’esecuzione dei test Gauge sulla loro griglia. Svantaggi: strato extra da imparare e mantenere; devi comunque scegliere e configurare un driver di automazione del browser (es. Selenium).

Dove vengono eseguiti

  • Playwright: Locale o CI; Python 3.8+; Windows, macOS, Linux. Funziona anche con browser cloud/remote (es. ZenRows, LambdaTest) collegandosi a un endpoint WebSocket o CDP.
  • Selenium: Locale o CI; qualsiasi linguaggio con un client WebDriver; Selenium Grid o un provider come LambdaTest per la scalabilità.
  • Puppeteer: Solo Node.js; tipicamente Chrome/Chromium sulla macchina o in Docker.
  • LambdaTest: Solo cloud; esegui Selenium/Playwright (o Gauge su Selenium) contro la loro griglia.
  • ZenRows: Browser di scraping cloud; lo guidi da Python (es. Playwright) o altri strumenti compatibili con CDP.
  • Gauge: Esegue sulla tua macchina o CI; utilizza Selenium (o un altro driver) sotto il cofano; può mirare alla griglia di LambdaTest.

Per un riferimento rapido delle tendenze dell’ecosistema Python, vedi progetti Python più popolari su GitHub; molti strumenti di automazione e test appaiono lì.

Come utilizzarli in Python

Playwright (Python)

Il pacchetto Python di Playwright fornisce sia API sincrone che asincrone. I browser vengono installati separatamente in modo che la libreria rimanga piccola e puoi scegliere solo i motori necessari (Chromium, Firefox, WebKit). Installa e installa i browser:

pip install playwright
playwright install

Esempio sincrono (naviga, clicca, leggi il testo - Playwright auto-wait per gli elementi):

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://example.com")
    print(page.title())
    # Clicca sul link, quindi controlla l'intestazione (built-in auto-wait)
    page.get_by_role("link", name="More information...").click()
    heading = page.get_by_role("heading", name="Example Domain").text_content()
    print(heading)
    browser.close()

L’asincrono è consigliato per la concorrenza e si adatta ai flussi di lavoro di output strutturati LLM o script che eseguono I/O mentre il browser è in esecuzione:

from playwright.async_api import async_playwright
import asyncio

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://example.com")
        print(await page.title())
        await browser.close()

asyncio.run(main())

Per un foglio di riferimento Python e riferimento sintassi, tieni un documento locale a portata di mano.

Selenium (Python)

Il client Python utilizza il protocollo W3C WebDriver. Selenium 4+ utilizza Selenium Manager per scaricare e gestire automaticamente il driver corretto (ChromeDriver, GeckoDriver, ecc.), quindi non è più necessario scaricare manualmente i driver:

pip install selenium

Esempio base con attesa esplicita (Selenium non auto-wait; utilizza WebDriverWait o condizioni attese):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
# Attendi che il body sia presente, quindi ottieni il titolo
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print(driver.title)
driver.quit()

Clicca e leggi il testo:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.LINK_TEXT, "More information. .."))
)
link.click()
heading = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "h1"))
)
print(heading.text)
driver.quit()

Puppeteer (Node.js; nessun ufficiale Python)

Puppeteer è solo JavaScript/Node.js - Google non mantiene alcuna API Python. Se hai bisogno di un’esperienza simile a Puppeteer in Python, utilizza Playwright (stessa idea di “controllo Chrome su CDP”, con API Python di prima classe e auto-wait). Esiste un porting non ufficiale pyppeteer, ma non è attivamente mantenuto; per nuovi progetti Python, Playwright è una scelta migliore. Di seguito è l’esempio Node.js per poter confrontare l’API:

npm init -y && npm install puppeteer
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://example.com");
  console.log(await page.title());
  await page.click("a[href='https://www.iana.org/domains/example']");
  const text = await page.$eval("h1", (el) => el.textContent);
  console.log(text);
  await browser.close();
})();

LambdaTest (Python: Selenium)

Utilizzi lo stesso API Selenium; l’unico cambiamento è collegarti al hub di WebDriver remoto di LambdaTest invece di un driver locale. Imposta le capacità (browser, OS, nome build, ecc.) e passa il tuo username e chiave di accesso dal dashboard di LambdaTest:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.browser_version = "latest"
options.platform_name = "Windows 11"

lt_caps = {
    "lt:options": {
        "username": "YOUR_LT_USERNAME",
        "accessKey": "YOUR_LT_ACCESS_KEY",
        "build": "Playwright-Selenium-Compare",
        "name": "Selenium on LambdaTest",
    }
}
options.set_capability("lt:options", lt_caps["lt:options"])

driver = webdriver.Remote(
    command_executor="https://YOUR_LT_USERNAME:YOUR_LT_ACCESS_KEY@hub.lambdatest.com/wd/hub",
    options=options,
)
driver.get("https://example.com")
print(driver.title)
driver.quit()

LambdaTest (Python: Playwright)

Playwright può collegarsi a un browser remoto tramite il CDP (Chrome DevTools Protocol). LambdaTest espone un endpoint CDP per ogni esecuzione del test; ti connetti a esso invece di lanciare un browser locale. Vedere i documenti di LambdaTest per il formato esatto dell’URL CDP e l’autenticazione:

from playwright.sync_api import sync_playwright

# LambdaTest fornisce un endpoint CDP per ogni esecuzione; utilizza i loro documenti per ottenerlo
CDP_URL = "wss://cdp.lambdatest.com/playwright?capabilities=..."  # da LT dashboard

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(CDP_URL)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

ZenRows + Playwright (Python)

Il browser di scraping di ZenRows è compatibile con CDP, quindi utilizza Playwright’s connect_over_cdp() con il loro URL WebSocket. Il browser esegue in cloud ZenRows con i loro proxy e gestione anti-bot; il tuo script rimane lo stesso tranne come ti connetti. Solo il passo di avvio cambia:

from playwright.sync_api import sync_playwright

ZENROWS_WS = "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(ZENROWS_WS)
    page = browser.new_page()
    page.goto("https://example.com")
    html = page.content()
    print(html[:500])
    browser.close()

Poi passa l’HTML risultante al tuo parser o, ad esempio, convertire HTML in Markdown con Python per il processing successivo.

Gauge + Selenium (Python)

Gauge mantiene le specifiche in Markdown (o altri formati) e le implementazioni dei passaggi in Python. Ogni passaggio può richiamare Selenium (o qualsiasi altro driver) per aprire il browser, navigare e affermare. Esempio di layout:

Spec specs/example.spec:

# Esempio di specifica

## Apri il sito e controlla il titolo

* Apri il browser e vai a "https://example.com"
* Il titolo della pagina deve essere "Example Domain"

Passaggi step_impl/example.py:

from getgauge.python import step, before_scenario
from selenium import webdriver

driver = None

@before_scenario()
def init_driver():
    global driver
    driver = webdriver.Chrome()

@step("Apri il browser e vai a <url>")
def open_url(url):
    driver.get(url)

@step("Il titolo della pagina deve essere <title>")
def check_title(title):
    assert driver.title == title, f"Atteso {title}, ottenuto {driver.title}"

Installa Gauge, il runner Python e il plugin Selenium; esegui con gauge run specs/. Per eseguirlo su LambdaTest, imposta il driver Selenium per utilizzare l’URL remoto e le capacità di LambdaTest in un hook before_scenario invece di webdriver.Chrome().

Strumento Python Ruolo Migliore per
Playwright Automazione del browser Nuovi test E2E, scraping, multi-browser, velocità
Selenium Automazione del browser Test legacy, ecosistema ampio, molti browser
Puppeteer No Automazione del browser Progetti Node.js/Chrome-only
LambdaTest N/A Griglia cloud Esecuzione parallela, cross-browser, Gauge + Selenium
ZenRows Via PW Browser di scraping Anti-bot, proxy, CAPTCHA; utilizza con Playwright
Gauge Framework di test Specifiche BDD + Selenium (o altro driver)

Per nuovi progetti Python, Playwright è la scelta predefinita; aggiungi LambdaTest o ZenRows quando hai bisogno di scalabilità cloud o resilienza allo scraping. Mantieni Selenium per i set di test esistenti e Gauge quando desideri un design delle specifiche iniziale sopra Selenium.

Riferimenti