All'inizio dell'automazione dei test UI, la principale difficoltà era l'instabilità dei test a causa dei ritardi nell'apparizione degli elementi e della necessità di attendere azioni asincrone sulla pagina. In passato, i tester utilizzavano spesso ritardi fissi (sleep), il che portava a un'esecuzione prolungata dei test e a bassa stabilità.
Il problema sta nel fatto che le applicazioni web stanno diventando sempre più dinamiche. Gli elementi appaiono e scompaiono in modo asincrono, e il funzionamento simultaneo del frontend e del backend può provocare situazioni in cui i test terminano con errori a causa di attese errate sullo stato dell'interfaccia utente. Le pause statiche, come Thread.sleep(1000), aumentano solo il tempo di test e non garantiscono il successo nel passare il test.
La soluzione è utilizzare attese esplicite e implicite (explicit/implicit waits), che consentono di sincronizzare in modo più flessibile ed efficace le azioni con lo stato reale dell'interfaccia. Ad esempio, in Selenium o framework simili, si applicano WebDriverWait o analoghi per verificare l'apparizione degli elementi richiesti in base a una condizione:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.ID, "myElem")))
Caratteristiche chiave:
Perché è meglio non utilizzare solo attese implicite (implicit waits) invece di esplicite?
Le attese implicite si applicano all'intero driver e possono portare a ritardi inaspettati o conflitti con le attese esplicite, il che porta spesso a errori "TimeoutException".
Dovrei usare Thread.sleep per attese nei test UI?
L'uso di Thread.sleep è estremamente sconsigliato: porta a ritardi e instabilità eccessivi nei test. È meglio utilizzare attese esplicite e condizioni.
Cosa fare se l'elemento appare con un'animazione?
Attendere non solo l'apparizione dell'elemento, ma anche il suo stato (ad esempio, visibilità o cliccabilità), utilizzando condizioni speciali come visibility_of_element_located.
sleep) invece di condizioni.Nel progetto, l'attesa per l'apparizione di una finestra modale è stata implementata tramite Thread.sleep(3000). A volte la finestra appariva più velocemente, altre volte più lentamente. Gli script funzionavano lentamente e, con l'aumento del carico, i test fallivano talvolta.
Pro:
Contro:
È stata riprogettata la logica: tutte le azioni con l'interfaccia utente sono state incapsulate in funzioni con attese esplicite di visibilità e attività degli elementi, tutto è diventato più veloce, la stabilità è aumentata al 98%.
Pro:
Contro: