Playwright è una API dedicata all’automazione dei browser Chromium, Firefox e WebKit tramite una libreria comune, inizialmente basata su Javascript, ma che ad oggi supporta Python, C# e Java (e GO).

In passato i tool dedicati a questo tipo di lavoro (uno fra tutti Selenium) erano pesanti e complessi da gestire. Usati quasi esclusivamente per testare applicazioni web-based.
Chi aveva la necessità di integrare una qualche forma di automazione web in una applicazione stand-alone era fortemente invogliato a re-inventarsi il suo mini-framework, utilizzando binding disponibili per Webkit.
In effetti, è quello che è capitato a me circa 4 anni fa.
Nell’aprile 2017, ironia della sorte, Google sfornò Headless Chrome e successivamente la libreria Puppeteer che ne sfruttava le potenzialità..
Sebbene sia storicamente prevenuto nei confronti di Microsoft, devo ammettere che recentemente sta lavorando piuttosto bene. Playwright ne è una prova. Compatibile con i principali browser, ampio supporto ai linguaggi di programmazione, sintassi chiara e molto intuitiva (si può usare anche in modo sincrono).
Altro segnale piuttosto importante, a prescindere dalle valutazioni etiche, è il fatto che i due principali sviluppatori di Puppeteer, sono passati a Playwright.
A parte le solite procedure di test, provate a pensare quante operazioni ripetitive con i portali web possono essere automatizzate e ridotte ad un semplice script. Il limite è la vostra fantasia.
Come esempio, ho realizzato uno script Python, che, in modo del tutto automatico, preleva la fattura più recente dal sito WindTre (sono un loro cliente) e la salva nella directory corrente.
Ho utilizzato l’ultima versione di Playwright per Python, la 1.8.0. Gli aspetti su cui porre più attenzione sono la scelta dei selettori e la comprensione del flusso di navigazione .
Vanno impostate le variabili USER, PWD e NUM_TEL. Lo script si occuperà dell’autenticazione, di selezionare il numero telefonico voluto e scaricare il file:
from playwright.sync_api import sync_playwright import os from datetime import datetime URL = "https://areaclienti.windtre.it/login" USER = "utente" PWD = "password" NUM_TEL = "0550000000" # Recupera l'ultima fattura per il numero telefonico specificato with sync_playwright() as p: browser = None curdir = os.path.dirname(os.path.abspath(__file__)) try: browser = p.chromium.launch(headless=False) context = browser.new_context(accept_downloads=True) page = context.new_page() # Pagina di login page.goto(URL, wait_until='networkidle') # Inserimento user e password page.click("div.welcome-back >> button.btn-desktop") page.fill("#username", USER) page.fill("#password", PWD) with page.expect_navigation(wait_until='networkidle'): page.click("span >> text=ACCEDI") # Imposta il numero per il quale si vuole l'ultima fattura, # (se il selettore esiste, nel caso si abbia più di un numero) try: cambia = page.wait_for_selector("span >> text='Cambia linea'", timeout=5000) except Exception: pass else: cambia.click() sim = page.query_selector(f"div.sim-item__col >> text={NUM_TEL}") sim.click() page.click("span >> text=CONTINUA") with page.expect_navigation(wait_until='networkidle'): page.click("span >> text='VISUALIZZA FATTURE'") # Scarica nella directory corrente il file pdf della fattura più recente. with page.expect_download() as download_info: page.click("#invoice_table >> td >> img[alt=PDF]") download = download_info.value download.save_as(f"{curdir}/fattura_windtre.pdf") except Exception as e: now = datetime.now() print(f"\n{now:%Y-%m-%d %H:%M}: {e}") finally: if browser is not None: browser.close()