Oggi parliamo di sessioni, browser e driver nel web testing in Python. Quando dobbiamo affrontare un'attività con Selenium abbiamo bisogno di istruire una sessione la quale, sommariamente, sarà composta dalle seguenti fasi:
- apertura della sessione. Essenzialmente, in questo caso avvieremo un browser e soprattutto, per farlo, dovremo istanziare un driver che sarà il vettore con cui dialogheremo con esso. Questo è proprio l'argomento che approfondiremo nel seguito della lezione;
- caricamento di una pagina, tramite driver, con il metodo
get
che accetterà, come argomento, il relativo indirizzo web; - interazione con la pagina sia leggendone i contenuti sia richiedendole azioni delle quali, eventualmente, recupereremo i risultati. In questa parte, subentra un argomento molto importante che è quello della temporizzazione, il cosiddetto waiting. In pratica, considerando che la nostra sessione di lavoro si baserà, come detto, sul richiamare elementi presenti nella pagina, dovremo essere sicuri di poterlo fare senza errori attendendo che gli elementi che ci interessano siano disponibili. Il waiting ha proprio lo scopo di dare tempo al browser di eseguire il rendering delle varie componenti dell'interfaccia utente;
- chiusura della sessione quando le nostre interazioni con la pagina saranno esaurite così da mettere a riposo il driver liberandone le relative risorse. Allo scopo chiameremo il metodo
quit
dell'oggetto che rappresenta il driver.
Tutto ciò, sarà, a volte, da inserire in un ambito più ampio in cui il tutto dovrà operare come test di funzionamento di un'applicazione web per il quale saranno stati posti degli obiettivi e pianificate delle operazioni da verificare.
Iniziamo a lavorare con Selenium: sessioni, browser e driver
Per poter lavorare con un browser, ci serve, prima di tutto un driver.
Di base, i driver per i browser più comuni sono i seguenti:
- ChromeDriver per Chrome all'indirizzo https://sites.google.com/chromium.org/driver/;
- Microsoft Edge WebDriver per Edge all'indirizzo
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/; - WebDriver Support for Safari per Safari all'indirizzo https://webkit.org/blog/6900/webdriver-support-in-safari-10/;
- GeckoDriver per Firefox all'indirizzo https://github.com/mozilla/geckodriver/releases.
Qualora il driver non fosse disponibile, al momento di richiedere l'apertura di un browser si potrebbe incorrere in errori piuttosto antipatici. Con il tempo e le versioni, la capacità di Selenium di reperire i driver necessari è aumentata notevolmente portando all'integrazione nel sistema del Selenium Manager ma in generale - indipendentemente dal nostro sistema operativo e dalla versione di Selenium - ricordiamo che il driver di cui abbiamo bisogno deve essere presente nel PATH di sistema.
La prima riga che tipicamente si scriverà in uno script Selenium consisterà nell'importazione del package webdriver
che offrirà metodi e sottopackage per procedere all'apertura del browser. Ad esempio, iniziamo con l'attivazione di Firefox:
# importiamo webdriver
from selenium import webdriver
# apriamo Firefox
driver = webdriver.Firefox()
# invochiamo la homepage di Google
driver.get('https://www.google.com')
# inseriamo una richiesta di input per decidere quando chiudere il browser
input('Premere INVIO per chiudere il browser...')
# chiudiamo il browser
driver.quit()
Lanciando lo script (che chiameremo esempio.py
) con:
$ python esempio.py
vedremo comparire nel nostro display un browser Firefox con l'invocazione della homepage di Google. Prima di chiudere il tutto con quit
, potremmo eseguire tutte quelle operazioni di interazione che impareremo a fare nel corso della guida. Qui ci limitiamo a fermare l'esecuzione con un input
. Questo permetterà di attendere la pressione del pulsante INVIO da parte nostra ma, al contempo, dimostrerà che la finestra in cui abbiamo lanciato lo script resta attiva e disponibile per flussi di dati in input e output.
Test di avviabilità
Come esperimento potremo provare a modificare lo script e a lanciarlo nuovamente per dimostrare l'avviabilità di altri browser (o l'eventuale necessità di configurazione di un apposito driver) sostituendo la riga webdriver.Firefox()
con webdriver.Chrome()
per l'esecuzione del browser Chrome o con webdriver.Edge()
per l'esecuzione del browser di Microsoft.
Vale la pena ricordare che nel tempo sono nate diverse librerie per facilitare il reperimento di driver da sfruttare con Selenium come ad esempio il Webdriver Manager, installabile facilmente con:
pip install webdriver-manager
in grado di gestire in autonomia l'installazione dei vari driver. Ad esempio, si potrebbe avere Chrome con:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
Anche questa, nel caso si debba gestire un progetto con versioni di Selenium o sistemi operativi che ci pongano difficoltà, potrà essere una valida opzione su cui puntare.