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()
.
Navigazione tra tab e finestre
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:
- apriamo una pagina di Wikipedia riguardante l'Italia e stampiamo a console i relativi titolo e indirizzo web;
- salviamo l'handle della pagina;
- apriamo la pagina di Wikipedia riguardante Roma in una nuova scheda;
- attiviamo nuovamente la pagina dell'Italia;
- 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.