# Tutorial di Selenium: come utilizzare il framework di testing cross-browser

Al giorno d’oggi, lo sviluppo di un’applicazione web deve tenere conto delle diverse dimensioni dei display degli utenti. L’approccio responsive, che consente a un progetto web pubblicato di adattarsi automaticamente ai requisiti tecnici del rispettivo dispositivo, si è ormai affermato come standard indiscusso. Per un sito web moderno, oltre all’elevato grado di flessibilità in termini di dimensioni dello schermo, è altrettanto importante la **compatibilità con i vari browser**: gli utenti dovrebbero poter accedere a un sito senza limitazioni, che sia con Firefox, Chrome, Safari o un altro client web.

Per questo motivo, il cosiddetto [Cross-Browser testing](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/test-di-interoperabilita-su-diversi-browser/ "Test di interoperabilità su diversi browser") svolge da anni un ruolo importante nella **programmazione dei progetti web**. Uno degli strumenti più diffusi per condurre tali test è il framework Selenium, rilasciato da ThoughtWorks, che esamineremo meglio in questo tutorial.

## Che cos’è Selenium o Selenium WebDriver?

Al fine di ottimizzare il processo di sviluppo di un’applicazione gestionale per monitorare tempi e costi in Python, Jason Huggins ha creato nel 2004 con **JavaScriptTestRunner** il nucleo del framework di web testing, noto oggi come Selenium. Inizialmente, lo strumento veniva utilizzato solo internamente dalla società di software **ThoughtWorks**, dove Huggins lavorava a quel tempo. Dopo essere passato a **Google** (2007), ha proseguito con lo sviluppo e corretto i bug del software, che a quel punto era diventato open source (licenza Apache 2.0) e quindi accessibile a tutti. Dopo l’**integrazione dell’API WebDriver**, al framework di test è stato assegnato il suo nome attuale Selenium o Selenium WebDriver.

La versione odierna di Selenium si basa esclusivamente su HTML e JavaScript e consente agli sviluppatori di **testare e registrare le interazioni con un’applicazione web,** per poi ripeterle a piacere in modo del tutto automatizzato. I componenti chiave che rendono possibile questo processo di testing sono i seguenti:

- **Selenium Core**: è la modalità principale che contiene le funzionalità di base del framework, tra cui JavaScriptTestRunner e l’API del comando di test principale.
- **Selenium IDE**: Selenium IDE è l’ambiente di sviluppo del framework di testing, che serve, tra le altre cose, come base per l’estensione IDE per Chrome e Firefox, necessario per la registrazione e la riproduzione dei test.
- **Selenium WebDriver**: WebDriver è l’interfaccia essenziale per simulare le interazioni degli utenti in qualsiasi browser, che sia Firefox, Chrome, Edge, Safari o Internet Explorer. Dal 2018, l’API è uno [standard W3C](https://www.w3.org/TR/webdriver/ "Pagina di riepilogo del W3C su WebDriver") ufficiale.
- **Selenium Grid**: Selenium Grid è un’estensione di WebDriver o del suo predecessore Selenium Remote Control (RC), che consente di eseguire test in parallelo su più server. In questo modo permette di ridurre notevolmente la durata del test.

[YouTube video](https://www.youtube.com/watch?v=5FUdrBq-WFo)## In quali contesti si usa Selenium WebDriver?

Selenium è un elemento fisso dell’ambiente di test e funge soprattutto come quadro di riferimento per un’ampia varietà di programmi in questo contesto. Gli esempi più noti includono il framework end-to-end [Protractor](https://www.protractortest.org/#/ "Pagina ufficiale del progetto del framework Protractor"), progettato specificamente per **testare le applicazioni Angular e AngularJS**, che utilizza l’API WebDriver per simulare le interazioni con gli utenti. Anche il software di automazione dei test [Appium](https://appium.io/ "Sito di Appium"), **progettato per app mobili native e ibride**, utilizza l’interfaccia standardizzata per eseguire i test in modo facile e comodo nel linguaggio di programmazione preferito.

Un altro esempio che si basa su Selenium è il noto servizio web basato su cloud [BrowserStack](https://www.browserstack.com "Servizio cloud per l’automatizzazione di test per il browser: BrowserStack"). Questo servizio, sviluppato in India, offre diversi abbonamenti dopo un periodo di prova gratuito e utilizza il framework di testing come base per i suoi **test automatici per la versione desktop e Mobile**.

N.B. Selenium o Selenium WebDriver può naturalmente essere utilizzato anche come **software open source indipendente** dai programmi esistenti, come le soluzioni menzionate sopra. Con i vari componenti, che vengono combinati nel framework, questo non pone alcun problema, premesso che si disponga del know-how richiesto.

## Tutorial di Selenium WebDriver: come utilizzare il framework per i test sul web

Se desiderate creare i vostri casi di test con Selenium senza dipendere da un servizio o da un produttore di software esterni, non avete necessariamente bisogno di una conoscenza specifica in materia di programmazione. Il testing dei browser con il framework, infatti, consente **di scrivere gli script di test in vari linguaggi**, tra cui JavaScript, Java, C#, Ruby e Python. Nel seguente tutorial di Selenium, la configurazione e l’uso del framework saranno dimostrati a titolo di esempio utilizzando Python.

N.B. I seguenti passaggi di questo tutorial di Selenium WebDriver presuppongono che sia **installata una versione attuale di Python**.

### Passaggio 1: installazione di Selenium

Per utilizzare Selenium WebDriver potete scegliere tra diversi client e una serie di librerie, chiamate “**Language Bindings**”, che costituiscono la base del framework o della procedura di testing. Dovete però installare i **driver dei client e le librerie** per il linguaggio che volete utilizzare per gli script.

Nel nostro tutorial di Selenium WebDriver, abbiamo bisogno dei [Language Bindings per Python](https://pypi.org/project/selenium/ "Language Bindings Python per Selenium WebDriver"), che possono essere installati per impostazione predefinita con il pip del gestore pacchetti Python e il seguente comando:

```none
pip install selenium
```

In alternativa, è possibile scaricare il **pacchetto sorgente** al link indicato in precedenza, decomprimere l’archivio *tar.gz* e utilizzare il **file *setup.py*** per eseguire l’installazione. In questo caso, il comando richiesto è:

```none
python setup.py install
```

Nella seconda fase è necessario **scaricare e installare il driver del browser** a cui Selenium deve connettersi. Firefox, ad esempio, richiede il driver geckodriver, le cui versioni ufficiali sono disponibili nel seguente [repository di GitHub](https://github.com/mozilla/geckodriver/releases "github.com: geckodriver"). Un elenco completo dei driver per i principali browser (Chrome, Edge, Internet Explorer, Safari, ecc.) può essere consultato nella [documentazione online di Selenium](https://www.selenium.dev/documentation/en/webdriver/driver_requirements/#quick-reference "Sezione sviluppatori di Selenium: panoramica dei driver").

N.B. Se desiderate utilizzare Selenium tramite connessione remota, è necessario installare anche il componente server di Selenium. I relativi pacchetti di installazione sono disponibili nella [pagina ufficiale di download del framework](https://www.selenium.dev/downloads/ "Selenium: Downloads") (alla voce “Selenium Server (Grid)”). L’esecuzione dell’applicazione server richiede una versione attuale di Java Runtime Environment (JRE).

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

Una volta creati i prerequisiti per utilizzare Selenium WebDriver, è possibile iniziare a **scrivere script di test** per il progetto web. A questo scopo, è in genere sufficiente l’**editor di codice** scelto, ma si consiglia di utilizzare un **IDE** Python (o un ambiente di sviluppo per il linguaggio con cui si desidera lavorare) per massimizzare la produttività. Alcune soluzioni conosciute e diffuse sono ad esempio:

- **PyCharm**: l’IDE Python [PyCharm](https://www.jetbrains.com/pycharm/ "jetbrains.com: pagina riepilogativa di PyCharm") è disponibile gratuitamente in versione open source o come versione professionale a pagamento. Gli **script di test Selenium** possono comunque essere scritti con entrambe le versioni. I sistemi operativi supportati sono Windows, Linux e macOS.
- **PyDev**: [PyDev](https://www.pydev.org/ "Plug-in per Eclipse con IDE per Python: PyDev") è un plug-in Python per l’ambiente di sviluppo Eclipse, fondamentalmente progettato per lo sviluppo di applicazioni Java. L’**estensione** può essere scaricata e installata sia tramite la pagina del progetto che direttamente 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 desiderata, è possibile iniziare a scrivere script personalizzati per **automatizzare le interazioni del browser** utilizzando 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 automaticamente il motore di ricerca Google**, **digita un termine di ricerca e poi valuta** o **registra** i risultati. Sotto forma di codice, questi passaggi automatici si presentano così:

```none
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 riepilogato il **significato dei singoli componenti** dello script:

<table>
  <thead>
    <tr>
      <th>Riga/righe di codice</th>
      <th>Significato</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>from selenium import webdriverfrom selenium.webdriver.common.keys import Keys</td>
      <td>In primo luogo, viene caricato il modulo WebDriver per implementare le classi e i metodi per supportare i vari browser. Subito dopo, lo script carica la configurazione della tastiera virtuale per poter simulare gli input della tastiera in un secondo momento.</td>
    </tr>
    <tr>
      <td>driver = webdriver.Firefox()driver.implicitly\_wait(30)driver.maximize\_window()</td>
      <td>Nella seconda fase viene creata un’istanza di Firefox, che può essere controllata successivamente con i comandi Selenium. È previsto un timeout di 30 secondi per l’avvio del browser. La finestra del browser deve, inoltre, essere ingrandita.</td>
    </tr>
    <tr>
      <td>driver.get(“http://www.google.it”)</td>
      <td>Ora lo script richiama la pagina italiana di Google, che serve qui come base per le interazioni automatizzate con gli utenti.</td>
    </tr>
    <tr>
      <td>search\_field = driver.find\_element\_by\_id(“lst-ib”)search\_field.clear()</td>
      <td>Quando viene aperto il motore di ricerca, lo script cerca la casella di testo di Google, che è caratterizzata dall’attributo ID “lst-ib”. Non appena viene individuata, il campo di ricerca viene dapprima svuotato utilizzando il metodo clear().</td>
    </tr>
    <tr>
      <td>search\_field.send\_keys(“Termine di ricerca”)search\_field.submit()</td>
      <td>Segue l’inserimento del testo “Termine di ricerca”, che viene confermato con il metodo submit().</td>
    </tr>
    <tr>
      <td>lists= driver.find\_elements\_by\_class\_name(“\_Rm“)</td>
      <td>I singoli risultati di ricerca sono elencati come elementi &lt;a&gt;. In modo che possano essere controllati dal metodo find\_elements\_by\_class\_name, è necessario introdurlo a questo punto nello script.</td>
    </tr>
    <tr>
      <td>i=0for listitem in lists: print (listitem.get\_attribute(“innerHTML”)) i=i+1 if(i&gt;10): break</td>
      <td>Nell’ultimo passaggio attivo, lo script visualizza l’elenco dei risultati ottenuti, limitandolo alle prime dieci voci con tag &lt;a&gt;.</td>
    </tr>
    <tr>
      <td>driver.quit()</td>
      <td>La riga di codice finale assicura che l’istanza del browser venga terminata.</td>
    </tr>
  </tbody>
</table>

N.B. L’esempio utilizzato in questo tutorial di Selenium mostra chiaramente quanto il framework sia adatto per il testing dei browser. Mostra, inoltre, che Selenium WebDriver è altrettanto interessante per il [Web Scraping con Python](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/web-scraping-con-python/ "Web scraping con Python"), un altro dei numerosi usi della suite di testing. Potete ottenere informazioni più dettagliate su questa **raccolta di dati dal web** nel nostro articolo [“Che cos’è il Web Scraping?”](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/che-cose-il-web-scraping/ "Che cos’è il web scraping?").

## Selenium WebDriver: non adatto a tutti gli scenari

Selenium o Selenium WebDriver offre strumenti di prima classe per **raccogliere importanti dati di siti web** e **simulare le interazioni con gli utenti**. Il framework open source non è, tuttavia, adatto a tutte le aree di applicazione, come chiariscono gli sviluppatori 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](https://www.ionos.it/digitalguide/online-marketing/vendere-online/captcha-codici-e-immagini-come-protezione-spam/), ormai molto noti e largamente diffusi, sono stati appositamente sviluppati per **proteggere da bot e spam** e non sono quindi utilizzabili per processi di automazione con Selenium. Questi test di verifica devono quindi essere disattivati o temporaneamente sostituiti da un elemento alternativo 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’avanzamento del processo di download.
- **Codici di risposta HTTP**: Selenium presenta alcuni punti deboli nella gestione dei [codici di stato HTTP](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/spiegazione-dei-piu-importanti-codici-di-stato-http/). Tuttavia, questi svantaggi possono essere compensati, se necessario, con l’uso di un proxy aggiuntivo.
- **Accesso a servizi di terze parti**: che si tratti di una piattaforma di social media, di un servizio cloud o di un account e-mail, non è consigliabile accedere a fornitori di terze parti tramite una sessione di Selenium. Da un lato, i fornitori di tali servizi forniscono **API proprie** a fini di testing e, dall’altro, in tali casi, i test con il framework sono molto **onerosi**.
- **Testing delle prestazioni**: Selenium WebDriver non è adatto per semplici testing di performance, perché il framework non è progettato per questo scopo.


This is a markdown version of: [https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/tutorial-di-selenium-webdriver/](https://www.ionos.it/digitalguide/siti-web/programmazione-del-sito-web/tutorial-di-selenium-webdriver/) for AI/LLM consumption.