Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Python: Web testing e interazione con il browser

Python e web testing: interagiamo con il browser per verificare la corretta distribuzione dei contenuti da parte di un'applicazione
Python e web testing: interagiamo con il browser per verificare la corretta distribuzione dei contenuti da parte di un'applicazione
Link copiato negli appunti

Finora, nella nostra guida al Web testing in Python ci siamo concentrati sul contenuto della pagina web ed il browser non è stato altro che una sorta di "involucro" in cui vederla in azione. Essenzialmente, le funzionalità del browser sono state rappresentate, nello script in esecuzione, dall'oggetto driver ma questo offre la possibilità di interagire con tutto ciò che è il funzionamento del browser stesso. Sia esso Chrome, Firefox o un altro ancora. In questo articolo, scopriamo proprio tali funzionalità suddividendole per categorie.

La pagina richiamata

Una pagina web o una risorsa prodotta dinamicamente cui accediamo via browser è univocamente riconoscibile mediante il suo URL (Uniform Resource Locator), l'indirizzo web in pratica. Altro aspetto è il nome della pagina che tipicamente vediamo apparire in alto nel browser e che viene scelto dallo sviluppatore del contenuto associandolo al tag HTML title.

Questi elementi possono essere facilmente recuperati via Selenium con due semplici property offerte dal browser: title e current_url. Una volta invocata una pagina con il metodo get del driver ci basterebbe eseguire questi semplici test per vedere apparire le informazioni desiderate:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.example.com')
print(driver.title)
print(driver.current_url)
driver.quit()

Dimensioni e azioni fondamentali sul contenuto

Sempre tramite driver possiamo agire sulle dimensioni della finestra estendendola al massimo:

driver.maximize_window()
# con variante fullscreen
driver.fullscreen_window()

impostandone le dimensioni:

driver.set_window_size(920, 620)

o decidendo in che punto collocare il suo angolo in alto a sinistra

driver.set_window_position(100, 200)
# con possibilità di recuperarne le informazioni
coordinata_orizzontale = driver.get_window_position().get('x')
coordinata_verticale = driver.get_window_position().get('y')

Inoltre, possiamo svolgere le tipiche operazioni di:

  • back, ritorno alla pagina precedente, con driver.back();
  • forward, passaggio alla pagina successiva, con driver.forward();
  • refresh, aggiornamento della pagina corrente, con driver.refresh().

Altra caratteristica cui i browser ci hanno abituato in qualità di utenti consiste nella presenza di finestre e tab in cui visualizzare i contenuti. A seconda dell'uso che ne stiamo facendo possiamo scegliere se dirottare contenuti su altre finestre o aprirli in un'altra scheda e le applicazioni spesso lo fanno in autonomia. Infatti come sviluppatori di applicazioni web e web designer possiamo impostare link e azioni che si svilupperanno non nella stessa scheda del browser in cui sono apparsi ma anche in altre finestre o schede.

Pertanto un nostro programma per il test automatizzato deve essere in grado di conoscere le aree di visualizzazione a disposizione del driver, attivare contenuti in nuove finestre, passare il controllo ad un'altra area.

Fondamentalmente, Selenium non distingue tra schede e finestre sebbene nella versione 4 abbia fatto la sua comparsa una soluzione per ovviare a tutto questo. Le aree di visualizzazione - siano esse schede o finestre - sono indirizzate da un identificativo univoco, dalla forma di lungo codice esadecimale tipo 0DB35DEE7F082C14748EB47A0CD1BD9E, accessibile tramite la proprietà current_window_handle dell'oggetto driver.

Tutti i window handle attivi sono individuabili tramite la struttura dati driver.window_handles. Prima di passare ad un esempio pratico diciamo ancora che l'oggetto driver dispone di una proprietà switch_to che gli permette di passare ad un'altra finestra/scheda in base all'handle o di aprirne una nuova infatti:

my_window_handle=...
driver.switch_to.window(my_window_handle)

renderà attiva la finestra/scheda con l'handle specificato, mentre:

driver.switch_to.new_window('window')
driver.switch_to.new_window('tab')

passeranno il controllo, rispettivamente, ad una finestra o scheda (solo a partire da Selenium 4) appena creata.

Esempio pratico di Web testing in Python

Con il seguente esempio facciamo una passeggiata tra le schede di un browser eseguendo una scaletta di operazioni che mostriamo in questo elenco numerato e che saranno scandite anche dalle indicazioni dei commenti innestati nel codice Python. Useremo delle invocazioni come input solo per decidere quando passare all'azione successiva e poter prendere così tutto il tempo necessario per eseguire la dimostrazione:

  1. apriamo una pagina di Wikipedia riguardante l'Italia e stampiamo a console i relativi titolo e indirizzo web;
  2. salviamo l'handle della pagina;
  3. apriamo la pagina di Wikipedia riguardante Roma in una nuova scheda;
  4. attiviamo nuovamente la pagina dell'Italia;
  5. ci facciamo stampare gli handle a disposizione.

from selenium import webdriver
driver = webdriver.Firefox()
# 1. Apriamo la pagina di Wikipedia riguardante l'Italia
driver.get('https://it.wikipedia.org/wiki/Italia')
print("Titolo della pagina: "+driver.title)
print("Indirizzo corrente: "+driver.current_url)
# 2. Salviamo handle di questa pagina
pagina_italia=driver.current_window_handle
input("\nPremere INVIO per aprire una nuova scheda su Roma...")
# 3. Apriamo una nuova scheda dove visitiamo la pagina su Roma
driver.switch_to.new_window('tab')
driver.get('https://it.wikipedia.org/wiki/Roma')
input("\nPremere INVIO per tornare alla pagina dell'Italia...")
# 4. Torniamo alla scheda riguardante l'Italia
driver.switch_to.window(pagina_italia)
# 5. Stampiamo a console gli handle disponibili
for window_handle in driver.window_handles:
    print(f"- {window_handle}")
input("\nPremere INVIO per chiudere l'esperimento...")
driver.quit()

Potremo inoltre chiudere la scheda attiva quando desidereremo passando per driver.close().

Conclusioni: usare Python per i test

Tutte queste operazioni sul browser, in fase di test, possono assumere dei connotati fondamentali sia per dimostrare l'effettiva capacità dell'applicazione di distribuire i contenuti nelle aree di visualizzazione sia per rendere più chiaro ed efficace il set di operazioni che stiamo svolgendo nel test. Avremo modo di approfondire l'argomento nel resto della guida.

Ti consigliamo anche