Al giorno d’oggi, lo sviluppo di un’ap­pli­ca­zio­ne web deve tenere conto delle diverse di­men­sio­ni dei display degli utenti. L’approccio re­spon­si­ve, che consente a un progetto web pub­bli­ca­to di adattarsi au­to­ma­ti­ca­men­te ai requisiti tecnici del ri­spet­ti­vo di­spo­si­ti­vo, si è ormai affermato come standard in­di­scus­so. Per un sito web moderno, oltre all’elevato grado di fles­si­bi­li­tà in termini di di­men­sio­ni dello schermo, è al­tret­tan­to im­por­tan­te la com­pa­ti­bi­li­tà con i vari browser: gli utenti do­vreb­be­ro poter accedere a un sito senza li­mi­ta­zio­ni, che sia con Firefox, Chrome, Safari o un altro client web.

Per questo motivo, il co­sid­det­to Cross-Browser testing svolge da anni un ruolo im­por­tan­te nella pro­gram­ma­zio­ne dei progetti web. Uno degli strumenti più diffusi per condurre tali test è il framework Selenium, ri­la­scia­to da Thought­Works, che esa­mi­ne­re­mo meglio in questo tutorial.

Che cos’è Selenium o Selenium WebDriver?

Al fine di ot­ti­miz­za­re il processo di sviluppo di un’ap­pli­ca­zio­ne ge­stio­na­le per mo­ni­to­ra­re tempi e costi in Python, Jason Huggins ha creato nel 2004 con Ja­va­Script­Te­stRun­ner il nucleo del framework di web testing, noto oggi come Selenium. Ini­zial­men­te, lo strumento veniva uti­liz­za­to solo in­ter­na­men­te dalla società di software Thought­Works, dove Huggins lavorava a quel tempo. Dopo essere passato a Google (2007), ha pro­se­gui­to con lo sviluppo e corretto i bug del software, che a quel punto era diventato open source (licenza Apache 2.0) e quindi ac­ces­si­bi­le a tutti. Dopo l’in­te­gra­zio­ne dell’API WebDriver, al framework di test è stato assegnato il suo nome attuale Selenium o Selenium WebDriver.

La versione odierna di Selenium si basa esclu­si­va­men­te su HTML e Ja­va­Script e consente agli svi­lup­pa­to­ri di testare e re­gi­stra­re le in­te­ra­zio­ni con un’ap­pli­ca­zio­ne web, per poi ripeterle a piacere in modo del tutto au­to­ma­tiz­za­to. I com­po­nen­ti chiave che rendono possibile questo processo di testing sono i seguenti:

  • Selenium Core: è la modalità prin­ci­pa­le che contiene le fun­zio­na­li­tà di base del framework, tra cui Ja­va­Script­Te­stRun­ner e l’API del comando di test prin­ci­pa­le.
  • Selenium IDE: Selenium IDE è l’ambiente di sviluppo del framework di testing, che serve, tra le altre cose, come base per l’esten­sio­ne IDE per Chrome e Firefox, ne­ces­sa­rio per la re­gi­stra­zio­ne e la ri­pro­du­zio­ne dei test.
  • Selenium WebDriver: WebDriver è l’in­ter­fac­cia es­sen­zia­le per simulare le in­te­ra­zio­ni degli utenti in qualsiasi browser, che sia Firefox, Chrome, Edge, Safari o Internet Explorer. Dal 2018, l’API è uno standard W3C ufficiale.
  • Selenium Grid: Selenium Grid è un’esten­sio­ne di WebDriver o del suo pre­de­ces­so­re Selenium Remote Control (RC), che consente di eseguire test in parallelo su più server. In questo modo permette di ridurre no­te­vol­men­te la durata del test.

In quali contesti si usa Selenium WebDriver?

Selenium è un elemento fisso dell’ambiente di test e funge so­prat­tut­to come quadro di ri­fe­ri­men­to per un’ampia varietà di programmi in questo contesto. Gli esempi più noti includono il framework end-to-end Pro­trac­tor, pro­get­ta­to spe­ci­fi­ca­men­te per testare le ap­pli­ca­zio­ni Angular e AngularJS, che utilizza l’API WebDriver per simulare le in­te­ra­zio­ni con gli utenti. Anche il software di au­to­ma­zio­ne dei test Appium, pro­get­ta­to per app mobili native e ibride, utilizza l’in­ter­fac­cia stan­dar­diz­za­ta per eseguire i test in modo facile e comodo nel lin­guag­gio di pro­gram­ma­zio­ne preferito.

Un altro esempio che si basa su Selenium è il noto servizio web basato su cloud Bro­w­ser­Stack. Questo servizio, svi­lup­pa­to in India, offre diversi ab­bo­na­men­ti dopo un periodo di prova gratuito e utilizza il framework di testing come base per i suoi test au­to­ma­ti­ci per la versione desktop e Mobile.

N.B.

Selenium o Selenium WebDriver può na­tu­ral­men­te essere uti­liz­za­to anche come software open source in­di­pen­den­te dai programmi esistenti, come le soluzioni men­zio­na­te sopra. Con i vari com­po­nen­ti, che vengono combinati nel framework, questo non pone alcun problema, premesso che si disponga del know-how richiesto.

Tutorial di Selenium WebDriver: come uti­liz­za­re il framework per i test sul web

Se de­si­de­ra­te creare i vostri casi di test con Selenium senza dipendere da un servizio o da un pro­dut­to­re di software esterni, non avete ne­ces­sa­ria­men­te bisogno di una co­no­scen­za specifica in materia di pro­gram­ma­zio­ne. Il testing dei browser con il framework, infatti, consente di scrivere gli script di test in vari linguaggi, tra cui Ja­va­Script, Java, C#, Ruby e Python. Nel seguente tutorial di Selenium, la con­fi­gu­ra­zio­ne e l’uso del framework saranno di­mo­stra­ti a titolo di esempio uti­liz­zan­do Python.

N.B.

I seguenti passaggi di questo tutorial di Selenium WebDriver pre­sup­pon­go­no che sia in­stal­la­ta una versione attuale di Python.

Passaggio 1: in­stal­la­zio­ne di Selenium

Per uti­liz­za­re Selenium WebDriver potete scegliere tra diversi client e una serie di librerie, chiamate Language Bindings”, che co­sti­tui­sco­no la base del framework o della procedura di testing. Dovete però in­stal­la­re i driver dei client e le librerie per il lin­guag­gio che volete uti­liz­za­re per gli script.

Nel nostro tutorial di Selenium WebDriver, abbiamo bisogno dei Language Bindings per Python, che possono essere in­stal­la­ti per im­po­sta­zio­ne pre­de­fi­ni­ta con il pip del gestore pacchetti Python e il seguente comando:

pip install selenium

In al­ter­na­ti­va, è possibile scaricare il pacchetto sorgente al link indicato in pre­ce­den­za, de­com­pri­me­re l’archivio tar.gz e uti­liz­za­re il file setup.py per eseguire l’in­stal­la­zio­ne. In questo caso, il comando richiesto è:

python setup.py install

Nella seconda fase è ne­ces­sa­rio scaricare e in­stal­la­re il driver del browser a cui Selenium deve con­net­ter­si. Firefox, ad esempio, richiede il driver gec­ko­dri­ver, le cui versioni ufficiali sono di­spo­ni­bi­li nel seguente re­po­si­to­ry di GitHub. Un elenco completo dei driver per i prin­ci­pa­li browser (Chrome, Edge, Internet Explorer, Safari, ecc.) può essere con­sul­ta­to nella do­cu­men­ta­zio­ne online di Selenium.

N.B.

Se de­si­de­ra­te uti­liz­za­re Selenium tramite con­nes­sio­ne remota, è ne­ces­sa­rio in­stal­la­re anche il com­po­nen­te server di Selenium. I relativi pacchetti di in­stal­la­zio­ne sono di­spo­ni­bi­li nella pagina ufficiale di download del framework (alla voce “Selenium Server (Grid)”). L’ese­cu­zio­ne dell’ap­pli­ca­zio­ne server richiede una versione attuale di Java Runtime En­vi­ron­ment (JRE).

Passaggio 2: scegliere il giusto ambiente di sviluppo (IDE)

Una volta creati i pre­re­qui­si­ti per uti­liz­za­re Selenium WebDriver, è possibile iniziare a scrivere script di test per il progetto web. A questo scopo, è in genere suf­fi­cien­te l’editor di codice scelto, ma si consiglia di uti­liz­za­re un IDE Python (o un ambiente di sviluppo per il lin­guag­gio con cui si desidera lavorare) per mas­si­miz­za­re la pro­dut­ti­vi­tà. Alcune soluzioni co­no­sciu­te e diffuse sono ad esempio:

  • PyCharm: l’IDE Python PyCharm è di­spo­ni­bi­le gra­tui­ta­men­te in versione open source o come versione pro­fes­sio­na­le a pagamento. Gli script di test Selenium possono comunque essere scritti con entrambe le versioni. I sistemi operativi sup­por­ta­ti sono Windows, Linux e macOS.
  • PyDev: PyDev è un plug-in Python per l’ambiente di sviluppo Eclipse, fon­da­men­tal­men­te pro­get­ta­to per lo sviluppo di ap­pli­ca­zio­ni Java. L’esten­sio­ne può essere scaricata e in­stal­la­ta sia tramite la pagina del progetto che di­ret­ta­men­te tramite l’Update Manager. PyDev o Eclipse funziona su tutti i sistemi operativi attuali di Windows, macOS e Linux più diffusi.

Passaggio 3: creare script Python per il testing del browser (Firefox) con Selenium

Una volta pronta la soluzione de­si­de­ra­ta, è possibile iniziare a scrivere script per­so­na­liz­za­ti per au­to­ma­tiz­za­re le in­te­ra­zio­ni del browser uti­liz­zan­do le classi e le funzioni di Selenium. In questo tutorial di Selenium, creiamo un esempio di script Python per Firefox, che, nel browser Mozilla, chiama au­to­ma­ti­ca­men­te il motore di ricerca Google, digita un termine di ricerca e poi valuta o registra i risultati. Sotto forma di codice, questi passaggi au­to­ma­ti­ci si pre­sen­ta­no così:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# Per creare una sessione con Firefox
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
# Per aprire un’applicazione web
driver.get("http://www.google.it")
# Per localizzare una casella di testo
search_field = driver.find_element_by_id("lst-ib")
search_field.clear()
# Per inserire e confermare un termine di ricerca
search_field.send_keys("Termine di ricerca")
search_field.submit()
# Per ottenere l'elenco dei risultati di ricerca visualizzati
# grazie al metodo find_elements_by_class_name
lists= driver.find_elements_by_class_name("_Rm")
# Per scorrere tutti gli elementi e riprodurre un testo personalizzato
i=0
for listitem in lists:
    print (listitem.get_attribute("innerHTML"))
    i=i+1
    if(i>10):
        break
# Per chiudere la finestra del browser
driver.quit()

Nella tabella seguente viene rie­pi­lo­ga­to il si­gni­fi­ca­to dei singoli com­po­nen­ti dello script:

Riga/righe di codice Si­gni­fi­ca­to
from selenium import web­dri­ver­from selenium.webdriver.common.keys import Keys In primo luogo, viene caricato il modulo WebDriver per im­ple­men­ta­re le classi e i metodi per sup­por­ta­re i vari browser. Subito dopo, lo script carica la con­fi­gu­ra­zio­ne della tastiera virtuale per poter simulare gli input della tastiera in un secondo momento.
driver = webdriver.Firefox()driver.im­pli­ci­tly_wait(30)driver.maximize_window() Nella seconda fase viene creata un’istanza di Firefox, che può essere con­trol­la­ta suc­ces­si­va­men­te con i comandi Selenium. È previsto un timeout di 30 secondi per l’avvio del browser. La finestra del browser deve, inoltre, essere in­gran­di­ta.
driver.get("http://www.google.it") Ora lo script richiama la pagina italiana di Google, che serve qui come base per le in­te­ra­zio­ni au­to­ma­tiz­za­te con gli utenti.
search_field = driver.find_element_by_id("lst-ib")search_field.clear() Quando viene aperto il motore di ricerca, lo script cerca la casella di testo di Google, che è ca­rat­te­riz­za­ta dall’attributo ID "lst-ib". Non appena viene in­di­vi­dua­ta, il campo di ricerca viene dapprima svuotato uti­liz­zan­do il metodo clear().
search_field.send_keys("Termine di ricerca")search_field.submit() Segue l’in­se­ri­men­to del testo “Termine di ricerca”, che viene con­fer­ma­to con il metodo submit().
lists= driver.find_elements_by_class_name("_Rm") I singoli risultati di ricerca sono elencati come elementi <a>. In modo che possano essere con­trol­la­ti dal metodo find_elements_by_class_name, è ne­ces­sa­rio in­tro­dur­lo a questo punto nello script.
i=0for listitem in lists: print (listitem.get_attribute("innerHTML")) i=i+1 if(i>10): break Nell’ultimo passaggio attivo, lo script vi­sua­liz­za l’elenco dei risultati ottenuti, li­mi­tan­do­lo alle prime dieci voci con tag <a>.
driver.quit() La riga di codice finale assicura che l’istanza del browser venga terminata.
N.B.

L’esempio uti­liz­za­to in questo tutorial di Selenium mostra chia­ra­men­te quanto il framework sia adatto per il testing dei browser. Mostra, inoltre, che Selenium WebDriver è al­tret­tan­to in­te­res­san­te per il Web Scraping con Python, un altro dei numerosi usi della suite di testing. Potete ottenere in­for­ma­zio­ni più det­ta­glia­te su questa raccolta di dati dal web nel nostro articolo “Che cos’è il Web Scraping?”.

Selenium WebDriver: non adatto a tutti gli scenari

Selenium o Selenium WebDriver offre strumenti di prima classe per rac­co­glie­re im­por­tan­ti dati di siti web e simulare le in­te­ra­zio­ni con gli utenti. Il framework open source non è, tuttavia, adatto a tutte le aree di ap­pli­ca­zio­ne, come chia­ri­sco­no gli svi­lup­pa­to­ri nel loro elenco dei “Worst cases” (casi peggiori). I casi o i contenuti di siti web che non è possibile testare o acquisire con Selenium includono i seguenti:

  • Captcha: i captcha, ormai molto noti e lar­ga­men­te diffusi, sono stati ap­po­si­ta­men­te svi­lup­pa­ti per pro­teg­ge­re da bot e spam e non sono quindi uti­liz­za­bi­li per processi di au­to­ma­zio­ne con Selenium. Questi test di verifica devono quindi essere di­sat­ti­va­ti o tem­po­ra­nea­men­te so­sti­tui­ti da un elemento al­ter­na­ti­vo durante il testing o lo scraping.
  • Download di file: nelle istanze Selenium è possibile iniziare il download di file tramite un clic simulato del link, ma l’API non mostra l’avan­za­men­to del processo di download.
  • Codici di risposta HTTP: Selenium presenta alcuni punti deboli nella gestione dei codici di stato HTTP. Tuttavia, questi svantaggi possono essere com­pen­sa­ti, se ne­ces­sa­rio, con l’uso di un proxy ag­giun­ti­vo.
  • Accesso a servizi di terze parti: che si tratti di una piat­ta­for­ma di social media, di un servizio cloud o di un account e-mail, non è con­si­glia­bi­le accedere a fornitori di terze parti tramite una sessione di Selenium. Da un lato, i fornitori di tali servizi for­ni­sco­no API proprie a fini di testing e, dall’altro, in tali casi, i test con il framework sono molto onerosi.
  • Testing delle pre­sta­zio­ni: Selenium WebDriver non è adatto per semplici testing di per­for­man­ce, perché il framework non è pro­get­ta­to per questo scopo.
Vai al menu prin­ci­pa­le