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()