Se ti sei mai cimentato nell’automatizzare una web app moderna, sai bene quanto può essere snervante: scrivi un test Selenium, provi a cliccare un bottone e… nulla. Il bottone è fuori dallo schermo, oppure la pagina sta ancora caricando altri prodotti mentre scorri. Benvenuto nel mondo delle pagine dinamiche e dello scroll infinito, dove far “vedere” ai tuoi test quello che vede davvero un utente è già metà della battaglia. Dopo anni passati a smanettare con l’automazione web, posso dirti che uno scroll fatto bene in Selenium non è solo un dettaglio: è la differenza tra test ballerini e automazioni solide, pronte per la produzione.
Scopriamo insieme perché lo scroll in Selenium è così importante, le tecniche migliori per gestire tutto—dalle liste lazy-loaded alle intestazioni fisse—e come strumenti come possono darti una marcia in più. Ti porto esempi di codice, dritte specifiche per ogni browser e qualche trucco imparato sul campo, così potrai finalmente smettere di litigare con i test e iniziare a fidarti dei risultati.
Le basi dello scroll in Selenium
Cosa vuol dire davvero “scroll in Selenium”? Nell’automazione web, significa spostare in modo programmato la finestra del browser—su, giù, a destra, a sinistra o verso un elemento preciso—per rendere visibile il contenuto con cui vuoi interagire. Selenium WebDriver, di default, non scrolla per te. Se provi a cliccare su qualcosa fuori dallo schermo, spesso ti becchi il temuto ElementNotInteractableException (). Ecco perché uno scroll preciso e voluto è fondamentale per l’automazione affidabile dei test UI.
Ecco i principali tipi di azioni di scroll che userai con Selenium:
- Scroll verticale: Muovi la pagina su e giù per vedere più contenuti.
- Scroll orizzontale: Perfetto per tabelle larghe o caroselli.
- Scroll verso un elemento: Porta un elemento specifico in vista, di solito con
scrollIntoView. - Scroll per pixel: Sposta la finestra di un certo numero di pixel—utile per uno scroll graduale.
- Scroll in cima/fondo pagina: Vai subito all’inizio o alla fine della pagina.
Perché è così importante? Perché le web app moderne sono piene di elementi dinamici—feed a scroll infinito, bottoni “Carica altro”, intestazioni fisse e immagini che si caricano solo quando le vedi. Se il tuo test non scrolla, non può vedere (o verificare) metà dell’interfaccia. Questo vuol dire che i bug passano inosservati o i test falliscono per motivi sbagliati ().
Errori tipici:
- Trovare un elemento non vuol dire che sia visibile o cliccabile.
- Azioni come
.click()o.sendKeys()non scrollano automaticamente sull’elemento. - Le intestazioni fisse possono coprire elementi anche dopo lo scroll.
- Le pagine a scroll infinito richiedono scroll ripetuti e incrementali per caricare tutto.
Ecco un esempio veloce in Java per portare un elemento in vista:
1((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Così il tuo elemento target sarà visibile in cima alla finestra—niente più errori “element not interactable”.
Perché uno scroll efficiente in Selenium è fondamentale nei test web
Parliamoci chiaro: la maggior parte delle web app moderne si basa su contenuti dinamici che appaiono solo dopo lo scroll. Secondo dati recenti, oltre , e il numero reale è sicuramente più alto. Se i tuoi test Selenium non scrollano, ti perdi una fetta enorme dell’applicazione.
Quando serve scrollare:
- Liste infinite o lazy-loaded: Feed social, griglie di prodotti, dashboard SaaS.
- Bottoni “Carica altro”: E-commerce, news, directory.
- Bottoni o link nascosti: Elementi che compaiono solo dopo lo scroll.
- Intestazioni fisse: Possono coprire elementi, richiedendo uno scroll preciso.
- Tabelle grandi o caroselli: Spesso serve uno scroll orizzontale o all’interno di contenitori.
| Scenario di test | Perché serve lo scroll |
|---|---|
| Feed di contenuti infinito (es. social) | I nuovi post si caricano mentre scorri. I test devono scorrere ripetutamente per caricare e verificare tutto. |
| Paginazione "Carica altro" | Gli elementi aggiuntivi non sono nel DOM finché non scorri/clicchi. |
| Immagini lazy-loaded | Le immagini si caricano solo quando visibili—i test devono scorrere per verificarle tutte. |
| Intestazione fissa che copre contenuti | Gli elementi possono essere nascosti sotto l’intestazione—lo scroll deve tenerne conto. |
| Tabelle/caroselli scrollabili grandi | Solo una parte del contenuto è visibile; i test devono scorrere per accedere e validare tutte le righe. |
Vantaggi:
- Copertura dei test più ampia: Controlli tutti gli elementi UI, non solo quelli visibili al caricamento.
- Meno lavoro manuale: Niente più test rotti o interventi manuali per mostrare i contenuti.
- Automazione più affidabile: Meno errori “element not found” o “not interactable”.
Immagina un sito e-commerce con 100 prodotti ma solo 20 visibili alla volta. Un test senza scroll verifica solo il 20% del catalogo—lasciando l’80% senza controllo. Uno scroll efficiente ti permette di trovare più bug, più in fretta.

Tutti i modi per scrollare: confronto tra le tecniche di scroll in Selenium
Selenium non ha un comando unico tipo “scrollDown()”, ma offre diversi modi per ottenere il risultato. Ecco una panoramica:
| Metodo | Supporto browser | Complessità | Miglior utilizzo |
|---|---|---|---|
| Actions API (Wheel input) | Chrome, Edge (Selenium 4) | Media | Scroll nativo e preciso su elemento o offset |
| JavaScriptExecutor | Tutti i browser | Facile | Scroll su elemento, per pixel o a fine pagina |
| Tasti tastiera (Page Down, ecc) | Tutti i browser | Facile | Simula lo scroll da tastiera dell’utente |
| Scroll in elementi | Tutti i browser | Media | Scroll in contenitori, tabelle, caroselli |
Scroll verso elementi e per pixel
Scroll verso un elemento:
Perfetto quando sai esattamente cosa vuoi vedere.
1js.executeScript("arguments[0].scrollIntoView();", webElement);
Oppure, con Selenium 4 Actions API (Chrome/Edge):
1new Actions(driver).scrollToElement(element).perform();
Scroll per pixel:
Ideale per scroll graduali o per regolare la posizione.
1js.executeScript("window.scrollBy(0, 350)", "");
Valori positivi per scendere, negativi per salire.
Quando usare cosa?
- Preferisci scroll-to-element per precisione e affidabilità.
- Usa scroll-by-pixels per carichi incrementali, effetti parallax o per simulare lo scroll di un utente.
Scroll in cima/fondo pagina e gestione dello scroll infinito
Scroll fino in fondo:
1js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
Scroll in cima:
1js.executeScript("window.scrollTo(0, 0)");
Gestione dello scroll infinito:
Serve un ciclo: scrolla, aspetta il caricamento, ripeti finché non si carica più nulla.
1long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
2while (true) {
3 js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
4 Thread.sleep(2000); // Usa wait espliciti nei test veri!
5 long newHeight = (Long) js.executeScript("return document.body.scrollHeight;");
6 if (newHeight == lastHeight) break;
7 lastHeight = newHeight;
8}
Questo schema ti assicura di caricare tutto il contenuto, proprio come farebbe un utente ().
Scroll personalizzato in Selenium con execute_script
Per esigenze più avanzate, il JavaScript execute_script è il tuo asso nella manica. Puoi:
- Scrollare a step per simulare uno scroll fluido come un utente.
- Aspettare il caricamento dei contenuti dopo ogni scroll.
- Scrollare all’interno di contenitori specifici (come tabelle o caroselli).
- Gestire casi particolari (es. intestazioni fisse, elementi dinamici).
Esempio: scroll graduale e fluido
1for i in range(10):
2 driver.execute_script("window.scrollBy(0, 500);")
3 time.sleep(0.5)
Esempio: attendere il caricamento dopo lo scroll
1js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
2WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
3wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("new_element")));
Best practice:
- Associa sempre lo scroll a wait espliciti per i nuovi contenuti.
- Usa
{block: "center"}conscrollIntoViewper una visibilità migliore se serve. - Evita sleep fissi—usa wait legati a cambiamenti reali del contenuto.
- Per i contenitori, usa
element.scrollTop = ...oelement.scrollBy(...)via JS.
Ottimizzare lo scroll in Selenium per diversi browser
Qui viene il bello. Non tutti i browser gestiscono lo scroll allo stesso modo:
- Chrome/Edge: Supporto completo per Actions API e JavaScript.
- Firefox: Buon supporto JS, supporto parziale Actions API. Potrebbero servire aggiustamenti per uno scroll fluido.
- Safari: Niente supporto Actions API per lo scroll—usa solo JavaScript ().
- Modalità headless: Imposta sempre la dimensione della finestra, altrimenti lo scroll può comportarsi in modo strano.
Consigli:
- Testa la logica di scroll su tutti i browser target fin dall’inizio.
- Usa JavaScript come soluzione universale per lo scroll.
- Con intestazioni fisse, potresti dover scrollare qualche pixel in più o usare JS personalizzato per evitare sovrapposizioni.
- In modalità headless, imposta la dimensione della finestra con
driver.manage().window().setSize(...)per uno scroll coerente.
Thunderbit: accelera lo sviluppo dei test Selenium con scraping intelligente
Qui entra in gioco un vero jolly: . Mentre Selenium è perfetto per pilotare il browser, a volte hai bisogno di estrarre dati—soprattutto da pagine con tanto scroll o contenuti dinamici. Qui Thunderbit dà il meglio.
Come Thunderbit si integra con Selenium:
- Estrai tutti i dati, anche da pagine a scroll infinito: L’AI di Thunderbit può scrollare, paginare ed estrarre dati strutturati (come nomi prodotti, prezzi, immagini) in pochi clic.
- Genera dati di riferimento per i tuoi test: Usa Thunderbit per raccogliere rapidamente tutti i dati UI attesi, poi fai scrollare Selenium e verifica che l’interfaccia corrisponda.
- Accelera lo sviluppo dei test: La funzione “AI Suggerisci Campi” di Thunderbit ti aiuta a identificare selettori e struttura, facilitando la scrittura dei locator Selenium.
Esempio di flusso di lavoro:
- Usa Thunderbit per estrarre tutti i prodotti da una pagina e-commerce dinamica (scorrerà e raccoglierà tutto per te).
- Esporta i dati su Google Sheets o CSV.
- Nel tuo test Selenium, scrolla la pagina, raccogli le info dei prodotti visibili e confrontale con il dataset di Thunderbit.
- Verifica che tutti i prodotti siano presenti, caricati correttamente e che nessun dato manchi.
Questa combinazione ti fa risparmiare tempo nella scrittura di codice di scraping fragile e ti permette di concentrarti sulla validazione dei dati che contano. Le funzioni di e scraping programmato di Thunderbit sono particolarmente utili per siti grandi e dinamici.
Esempi pratici: scroll efficiente in casi reali con Selenium
Passiamo alla pratica. Ecco alcuni scenari reali e codice che puoi adattare:
1. Scrollare una tabella di grandi dimensioni
Supponiamo di avere una griglia dati con una propria barra di scroll:
1WebElement table = driver.findElement(By.id("data-table"));
2js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", table);
Scrolla fino in fondo alla tabella. Puoi ciclare a step se vuoi validare ogni riga man mano che appare.
2. Navigare feed a scroll infinito
1prev_count = 0
2while True:
3 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
4 time.sleep(2)
5 posts = driver.find_elements(By.CSS_SELECTOR, ".post")
6 if len(posts) == prev_count:
7 break
8 prev_count = len(posts)
Carica tutti i post, fermandosi quando non ne compaiono di nuovi.
3. Validare immagini lazy-loaded
1List<WebElement> images = driver.findElements(By.tagName("img"));
2for (WebElement img : images) {
3 if ("lazy".equals(img.getAttribute("loading"))) {
4 js.executeScript("arguments[0].scrollIntoView(true);", img);
5 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
6 wait.until(d -> (Boolean) ((JavascriptExecutor)d).executeScript("return arguments[0].complete && arguments[0].naturalWidth > 0;", img));
7 Assert.assertTrue((Integer) js.executeScript("return arguments[0].naturalWidth;", img) > 0);
8 }
9}
Scrolla ogni immagine lazy in vista e verifica che sia caricata.
4. Scroll orizzontale in un carosello
1WebElement carousel = driver.findElement(By.className("carousel"));
2js.executeScript("arguments[0].scrollBy(300, 0);", carousel);
Scrolla il carosello a destra di 300px.
5. Rilevare errori di caricamento contenuti
Dopo ogni scroll, usa wait espliciti per verificare nuovi contenuti o spinner di caricamento. Se scatta un timeout, registra lo stato e segnala un errore.
Guida step-by-step: implementare uno scroll efficiente in Selenium
Ecco una checklist operativa:
- Capisci quando serve scrollare: Il contenuto è nascosto, lazy-loaded o paginato?
- Assicurati che l’elemento sia presente: Usa wait espliciti per confermare che gli elementi esistano nel DOM.
- Scegli il metodo di scroll giusto:
- Scroll verso elemento per precisione.
- Scroll per pixel per carichi incrementali.
- Ciclo per scroll infinito.
- Implementa lo scroll: Usa JavaScript o Actions API secondo necessità.
- Sincronizza dopo ogni scroll: Aspetta il caricamento dei nuovi contenuti—non affidarti a sleep fissi.
- Valida il contenuto: Dopo lo scroll, verifica che gli elementi siano visibili, caricati e interagibili.
- Ottimizza per i browser: Testa su tutti i browser target; usa JS come fallback.
- Integra Thunderbit per l’estrazione dati: Usa Thunderbit per prelevare o validare grandi dataset.
- Riduci lo scroll superfluo: Scrolla solo quanto serve.
- Documenta la logica: Commenta il motivo della scelta di ogni approccio di scroll.
| Fase | Azione chiave |
|---|---|
| Individua necessità | Serve lo scroll in questo scenario? |
| Presenza elemento | Attendi che gli elementi siano nel DOM |
| Scegli metodo | Elemento, pixel, ciclo o scroll in contenitore |
| Implementa | Usa JS/Actions/Tasti secondo necessità |
| Sincronizza | Attendi il caricamento dopo ogni scroll |
| Valida | Verifica visibilità e correttezza |
| Ottimizza browser | Testa su Chrome, Firefox, Edge, Safari |
| Integra Thunderbit | Usa per estrazione/validazione dati |
| Minimizza | Evita scroll ridondanti |
| Documenta | Commenta e spiega l’approccio |
Conclusioni e takeaway
Uno scroll efficiente in Selenium è la base per un’automazione dei test web moderna e affidabile. Con contenuti dinamici e scroll infinito ovunque, i tuoi test devono scrollare come un vero utente per validare davvero l’interfaccia. Ecco cosa conta di più:
- Scroll mirato: Capisci quando e dove serve scrollare—non sperare che gli elementi siano già visibili.
- Usa gli strumenti giusti: Preferisci scroll-to-element per precisione, JavaScript per flessibilità e Actions API per comportamento nativo (dove supportato).
- Sincronizza e verifica: Aspetta sempre il caricamento dopo lo scroll e controlla che i contenuti siano visibili e corretti.
- Ottimizza per tutti i browser: Testa la logica di scroll ovunque e usa JavaScript come fallback universale.
- Sfrutta Thunderbit: Combina Selenium con per accelerare l’estrazione e la validazione dei dati—soprattutto su pagine dinamiche o con tanto scroll.
Vuoi portare i tuoi test Selenium al livello successivo? Prova l’estensione per uno sviluppo test più rapido e smart. E se vuoi altri consigli sull’automazione, dai un’occhiata al per guide e tutorial approfonditi.
Buono scroll—e che i tuoi test trovino sempre quello che cercano.
Domande frequenti
1. Perché Selenium a volte non riesce a interagire con elementi presenti nel DOM?
Perché Selenium non scrolla automaticamente gli elementi in vista. Se un elemento è fuori dallo schermo, potresti ricevere un ElementNotInteractableException. Usa azioni di scroll per assicurarti che gli elementi siano visibili prima di interagire.
2. Qual è il modo migliore per gestire pagine a scroll infinito in Selenium?
Usa un ciclo: scrolla fino in fondo, aspetta il caricamento dei nuovi contenuti e ripeti finché non ne compaiono più. Usa sempre wait espliciti legati ai cambiamenti del contenuto, non sleep fissi.
3. Come posso rendere il mio codice di scroll compatibile con tutti i browser?
Il metodo più universale è il JavaScript execute_script. L’Actions API funziona bene su Chrome/Edge, ma potrebbe non essere supportata su Safari o vecchie versioni di Firefox. Testa sempre la logica su tutti i browser target.
4. Posso scrollare all’interno di contenitori o tabelle, non solo nella pagina principale?
Certo! Usa JavaScript per impostare scrollTop o scrollBy sull’elemento contenitore. Ad esempio: js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", tableElement);
5. In che modo Thunderbit aiuta nell’automazione dei test Selenium?
Lo scraping AI di Thunderbit può estrarre tutti i dati da pagine dinamiche o a scroll infinito, fornendo dataset di riferimento per i tuoi test Selenium. Così puoi validare facilmente i contenuti UI e velocizzare lo sviluppo dei test—soprattutto su siti complessi e ricchi di dati.
Per approfondire Selenium, web scraping e le migliori pratiche di automazione, visita il .