Un colloquio su Selenium verifica due cose: se sai scrivere test UI stabili (wait, locator, page object) e se sai progettare un framework con cui un team possa convivere (struttura, dati, reporting, esecuzione in CI). I test flaky sono l'argomento che salta fuori più spesso, perché chiunque abbia usato Selenium ha dovuto combatterci.
Qui sotto trovi 24 domande con risposte. Gli esempi usano la sintassi di Java e Python dove il codice aiuta, ma i concetti valgono in qualsiasi linguaggio.
Le basi
1. Cos'è Selenium e quali sono i suoi componenti?
Selenium è una suite open source per l'automazione dei browser web. Selenium WebDriver controlla i browser tramite i loro driver ed è la parte a cui di solito ci si riferisce. Selenium Grid esegue i test in parallelo su più macchine e browser. Selenium IDE è un'estensione di record and playback. Selenium non gestisce le applicazioni desktop né il reporting dei test integrato, quindi lo si combina con un framework di test.
2. Come funziona WebDriver?
Il test invia comandi tramite il protocollo W3C WebDriver via HTTP a un browser driver come ChromeDriver o GeckoDriver, che controlla il browser e restituisce i risultati. Le versioni recenti di Selenium includono Selenium Manager, che trova e scarica il driver giusto.
3. Quali locator supporta Selenium e quali preferisci?
ID, name, class name, tag name, link text, partial link text, selettore CSS e XPath. Preferisci un ID stabile o un attributo dedicato ai test come data-testid, poi il CSS. Usa XPath quando devi risalire l'albero o fare match sul testo. Evita percorsi lunghi basati sulla posizione come /html/body/div[3]/div[2], che si rompono quando cambia il layout.
4. Qual è la differenza tra findElement e findElements?
findElement restituisce la prima corrispondenza e lancia NoSuchElementException se non ce n'è nessuna. findElements restituisce una lista, che è vuota se non c'è corrispondenza, quindi è utile per verificare che qualcosa non sia presente.
5. Qual è la differenza tra driver.close() e driver.quit()?
close() chiude la finestra corrente. quit() chiude tutte le finestre e termina la sessione. Usa quit() nel teardown così non restano processi del browser in giro.
Wait e test flaky
6. Quali sono i tipi di wait?
| Wait | Come funziona |
|---|---|
| Implicito | Un timeout globale per la ricerca degli elementi |
| Esplicito | Attende una condizione specifica su un elemento specifico |
| Fluent | Un wait esplicito con intervallo di polling personalizzato ed eccezioni ignorate |
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("submit")));
Preferisci i wait espliciti. Mescolare wait impliciti ed espliciti può causare ritardi imprevedibili.
7. Perché non dovresti usare Thread.sleep?
Attende sempre per tutto il tempo previsto, rallentando la suite, e in una giornata lenta è comunque troppo poco. Un wait basato su una condizione prosegue appena la condizione è soddisfatta e altrimenti fallisce con un messaggio chiaro.
8. Cosa causa i test flaky e come si risolvono?
Cause comuni e relative soluzioni:
- Timing: usa wait espliciti per la condizione esatta, non sleep.
- Dati condivisi o residui: crea i dati di test per ogni test e puliscili.
- Dipendenza tra test: rendi ogni test indipendente ed eseguibile da solo.
- Locator instabili: aggiungi test ID ed evita percorsi basati sulla posizione.
- Animazioni e overlay: attendi che l'overlay sparisca o disabilita le animazioni nell'ambiente di test.
- Problemi di ambiente: stabilizza l'ambiente di test e controlla rete e chiamate a servizi di terze parti.
- Interferenze in parallelo: isola lo stato per thread.
Metti in quarantena un test flaky così non blocca tutti, poi correggilo per bene. Non limitarti ad aggiungere retry ovunque, perché così nascondi bug reali.
9. Cos'è la StaleElementReferenceException?
L'elemento che hai trovato non è più collegato alla pagina, di solito perché la pagina è stata ri-renderizzata. Risolvi individuando di nuovo l'elemento subito prima di usarlo, oppure attendendo il nuovo elemento, invece di conservare riferimenti a lungo.
10. Come gestisci gli elementi che non sono cliccabili (ElementClickInterceptedException)?
Qualcosa copre l'elemento, ad esempio un banner o un overlay di caricamento. Attendi che l'overlay sparisca, fai scroll dell'elemento in vista oppure chiudi il banner. Usare un click via JavaScript dovrebbe essere l'ultima risorsa, perché un utente reale non riuscirebbe a cliccare e il test nasconderebbe un bug reale.
Gestire le funzionalità della pagina
11. Come gestisci menu a tendina, alert, frame e finestre?
- Menu a tendina: la classe Select per gli elementi select standard, e passaggi basati su click per i menu personalizzati.
- Alert: driver.switchTo().alert() per accettare, chiudere o leggere.
- Frame: switchTo().frame(...) e ritorno a defaultContent().
- Finestre e schede: recupera gli handle delle finestre, passa a quella nuova e torna indietro.
12. Come gestisci upload e download di file?
Per gli upload, invia il percorso del file all'elemento input type="file" con sendKeys. Per i download, imposta la cartella di download del browser nelle opzioni e attendi che il file compaia, poi controlla nome e contenuto.
13. Come esegui JavaScript in Selenium?
Tramite JavascriptExecutor.executeScript, ad esempio per fare scroll o leggere un valore a cui l'API non arriva. Usalo con moderazione.
14. Cos'è la modalità headless?
Il browser viene eseguito senza una finestra visibile, il che è più veloce e funziona su server e in CI. Verifica con un'esecuzione visibile quando fai debug, e controlla le dimensioni del viewport, perché il layout può essere diverso.
Progettazione del framework
15. Cos'è il Page Object Model?
Ogni pagina o componente è una classe che contiene i suoi locator e le azioni su di essa. I test chiamano metodi come loginPage.loginAs(user) e non toccano direttamente i locator. Quando la UI cambia, sistemi una sola classe invece di molti test.
class LoginPage:
def __init__(self, driver):
self.driver = driver
def login_as(self, user, password):
self.driver.find_element(By.ID, "user").send_keys(user)
self.driver.find_element(By.ID, "pass").send_keys(password)
self.driver.find_element(By.ID, "submit").click()
16. Cosa contiene un buon framework di test?
Un test runner (TestNG, JUnit, pytest), page object, una driver factory per browser diversi, configurazione per ambiente, gestione dei dati di test, helper per le attese, reporting, logging, screenshot in caso di fallimento e integrazione con la CI.
17. Come gestisci i dati di test?
Crea i dati necessari a un test tramite un'API o un setup sul database all'inizio, non attraverso la UI, e rimuovili alla fine. Tieni i dati in file o builder, non hard-coded nei test, ed evita test che dipendono da dati lasciati da un altro test.
18. Come esegui i test in parallelo?
Usa la funzionalità di parallelismo del runner, assegna a ogni thread il proprio driver (ad esempio con ThreadLocal), mantieni i test indipendenti ed esegui su Selenium Grid o su un servizio cloud di browser per scalare su più browser.
19. Cos'è Selenium Grid?
Un sistema con un hub e dei node (o una configurazione distribuita in Grid 4) che esegue i test su browser e sistemi operativi diversi in parallelo. Riduce il tempo totale di esecuzione e ti permette di coprire più browser.
Strategia e scenari
20. Cosa dovresti automatizzare con Selenium e cosa no?
Automatizza flussi stabili, di alto valore e ripetibili come login, checkout e percorsi di regressione critici. Non automatizzare controlli una tantum, UI che cambiano spesso o cose che è meglio testare a livelli più bassi. Una suite sana ha molti test unitari e di API, meno test UI e un piccolo insieme di flussi end-to-end.
21. Come testi un'applicazione che ha un captcha o un login a due fattori?
Non provare a superarli nel test. Usa un ambiente di test in cui sono disabilitati, un account di test con un codice fisso o un flag di bypass, oppure un'API di test per creare una sessione.
22. Un test passa in locale ma fallisce in CI. Cosa controlli?
Versioni di browser e driver, dimensioni dello schermo e differenze in headless, tempi su macchine più lente, dati dell'ambiente, accesso alla rete, fusi orari e locale, ed esecuzioni parallele che condividono dati. Cattura screenshot, sorgente della pagina e log in caso di fallimento per confrontare.
23. Come scegli tra Selenium, Playwright e Cypress?
Selenium supporta molti linguaggi e browser e ha un ecosistema enorme. Playwright e Cypress offrono attese integrate, setup più semplice e buoni strumenti di debug, e possono essere più adatti ai nuovi progetti. La scelta giusta dipende dal linguaggio, dalle esigenze sui browser e dalle competenze del team. Porta le tue motivazioni, non una preferenza di marca.
24. Guidami nell'automazione di un flusso di checkout.
"Creerei un utente e un prodotto tramite l'API, poi farei il login attraverso la UI o riutilizzerei una sessione. Un page object per ogni passaggio: ricerca, prodotto, carrello e pagamento. Userei un metodo di pagamento di test, attenderei l'elemento di conferma, verificherei l'ordine tramite la UI e l'API, e farei uno screenshot in caso di fallimento. Il test ripulirebbe il proprio ordine, girerebbe in parallelo e verrebbe eseguito nella pipeline a ogni merge."
Come prepararsi
Scrivi una piccola suite per un sito demo con page object, attese esplicite, screenshot in caso di fallimento e un'esecuzione in CI. Esercitati a spiegare come hai risolto un test flaky, con la causa e la modifica. Preparati a scrivere dal vivo un locator e un'attesa. Dai un'occhiata alla nostra guida all'assistente per colloqui di coding per le routine di pratica e alla guida ai colloqui comportamentali per il round sulle soft skill.
Pronuncia le tue risposte ad alta voce e rileggi una trascrizione per le parti vaghe come "basta aggiungere un'attesa". Segui le regole del datore di lavoro sugli strumenti di AI in qualsiasi colloquio dal vivo.
Esercitati con le risposte per il colloquio su Selenium con YesToTheOffer
Fai un colloquio tecnico simulato, spiega il tuo framework ad alta voce e rivedi la trascrizione in seguito. 30 minuti gratuiti, nessun abbonamento.



