Se hai mai provato ad automatizzare una moderna app web, conosci bene il problema: scrivi un test Selenium, clicchi un pulsante e—boom—non succede nulla. Alla fine, quel pulsante era fuori schermo, oppure la pagina stava ancora caricando altri prodotti mentre scorrevi. Benvenuto nel mondo delle pagine web dinamiche a scorrimento infinito, dove riuscire a far “vedere” ai tuoi test ciò che vede un utente reale è metà della battaglia. Ho passato anni a lavorare con automazioni web e posso dirtelo con certezza: uno scrolling efficiente in Selenium non è un optional—è ciò che separa test fragili e inaffidabili da automazioni robuste, pronte per la produzione.
Vediamo perché lo scrolling in Selenium è così importante, quali sono le tecniche migliori per gestire di tutto, dalle liste lazy-loaded agli sticky header, e come strumenti come Thunderbit possono dare una marcia in più al tuo flusso di lavoro. Ti mostrerò codice pratico, consigli specifici per browser e qualche lezione imparata sul campo—così potrai smettere di combattere con i test e iniziare a fidarti dei risultati.
Comprendere le basi dello scrolling in Selenium
Quindi, cosa significa davvero “scrolling in Selenium”? Nell’automazione web, si tratta di spostare in modo programmatico il viewport del browser—su, giù, a sinistra, a destra o fino a un elemento specifico—in modo che il contenuto con cui vuoi interagire sia davvero visibile. Di default, Selenium WebDriver non esegue lo scrolling per te. Se provi a cliccare un elemento fuori schermo, spesso otterrai la temuta ElementNotInteractableException (GeeksforGeeks). Ecco perché uno scrolling preciso e intenzionale è indispensabile per un’automazione affidabile dei test UI. Tutto ciò che trovi in questa guida è pensato per la linea Selenium 4.x — l’input wheel/scroll è stato introdotto in Selenium 4.2 ed è ancora il modo attuale di farlo nell’ultima release 4.43 (download di Selenium). Se sei ancora su Selenium 3, gli snippet dell’Actions API non compileranno e dovrai ricorrere ai pattern JavascriptExecutor mostrati più avanti.
Ecco le principali tipologie di scroll che userai in Selenium:
- Scrolling verticale: spostare la pagina su o giù per mostrare più contenuti.
- Scrolling orizzontale: utile per tabelle larghe o caroselli.
- Scroll fino a un elemento: porta un elemento specifico in vista, di solito con
scrollIntoView. - Scroll per pixel: sposta il viewport di un numero fisso di pixel—utile per uno scrolling incrementale.
- Scroll all’inizio/fine pagina: salta direttamente all’inizio o alla fine di una pagina.
Perché è importante? Perché oggi le pagine web sono piene di elementi dinamici—pensa ai feed a scorrimento infinito, ai pulsanti “Carica altro”, agli sticky header e alle immagini lazy-loaded. Se il tuo test non sa scorrere, non riesce a vedere (o verificare) metà dell’interfaccia. E questo significa far passare bug inosservati o far fallire i test per i motivi sbagliati (BrowserStack).
Problemi comuni:
- Individuare un elemento non significa che sia visibile o cliccabile.
- Azioni come
.click()o.sendKeys()non eseguono automaticamente lo scroll fino all’elemento. - Gli header fissi possono coprire gli elementi anche dopo lo scrolling.
- Le pagine a scorrimento infinito richiedono scroll ripetuti e incrementali per caricare tutto il contenuto.
Ecco un rapido esempio Java per portare un elemento in vista:
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Questo garantisce che l’elemento target sia visibile nella parte alta del viewport—niente più errori “element not interactable”.
Perché uno scrolling efficiente in Selenium è importante per il testing web
Diciamolo chiaramente: la maggior parte delle app web moderne si basa su contenuti dinamici che compaiono solo dopo aver scrollato. Secondo dati recenti, oltre 516.000 siti live usano lo scorrimento infinito solo tramite jQuery, e il numero reale è probabilmente molto più alto. Se i tuoi test Selenium non scorrono mai, ti stai perdendo una parte enorme della tua applicazione.
Dove lo scrolling è necessario:
- Liste infinite/lazy-loaded: feed social, griglie prodotti, dashboard SaaS.
- Pulsanti “Carica altro”: siti e-commerce, news e directory.
- Pulsanti o link nascosti: elementi che compaiono solo dopo lo scrolling.
- Sticky header: possono coprire gli elementi, richiedendo un posizionamento preciso dello scroll.
- Tabelle grandi o caroselli: spesso richiedono scrolling orizzontale o specifico del contenitore.
| Scenario di test | Perché è necessario lo scrolling |
|---|---|
| Feed di contenuti infinito (es. social media) | Nuovi post si caricano man mano che scorri. I test devono scorrere ripetutamente per caricare e verificare tutti gli elementi. |
| Paginazione “Carica altro” | Gli elementi aggiuntivi non sono nel DOM finché non scrolli/clicchi. |
| Immagini lazy-loaded | Le immagini si caricano solo quando entrano nel viewport—i test devono scorrere per verificare che tutte siano presenti e caricate. |
| Header fisso che copre il contenuto | Gli elementi possono finire nascosti sotto l’header—lo scrolling deve tenerne conto. |
| Tabelle/carousel scorrevoli di grandi dimensioni | Solo una parte del contenuto è visibile alla volta; i test devono scorrere per accedere e validare tutte le righe/gli elementi. |
ROI:
- Copertura di test migliorata: verifichi tutti gli elementi UI, non solo quelli visibili al caricamento.
- Meno lavoro manuale: niente più test da spezzare o interventi manuali per mostrare il contenuto.
- Automazione più affidabile: meno falsi negativi dovuti a errori “element not found” o “not interactable”.
Immagina un sito e-commerce con 100 prodotti ma solo 20 caricati alla volta. Un test senza scrolling controlla solo il 20% del catalogo—lasciando l’80% non testato. Uno scrolling efficiente ti permette di trovare più bug, più velocemente.

Tutti i modi per scorrere: confronto tra le tecniche di scrolling in Selenium
Selenium non ha un singolo comando “scrollDown()”, ma ti offre diversi modi per ottenere lo stesso risultato. Ecco una panoramica rapida:
| Metodo | Supporto browser | Complessità | Caso d’uso migliore |
|---|---|---|---|
| Actions API (input wheel) | Chrome, Edge (Selenium 4) | Media | Scroll nativo e preciso fino a un elemento o per offset |
| JavaScriptExecutor | Tutti i browser | Facile | Scroll fino a un elemento, per pixel o a fine pagina |
| Tasti della tastiera (Page Down, ecc.) | Tutti i browser | Facile | Simulare lo scrolling dell’utente tramite tastiera |
| Scroll dentro gli elementi | Tutti i browser | Media | Scorrere dentro contenitori, tabelle, caroselli |
Scorrere fino agli elementi e per pixel
Scroll fino a un elemento:
Ideale quando sai esattamente cosa vuoi vedere.
js.executeScript("arguments[0].scrollIntoView();", webElement);
Oppure, con Selenium 4 Actions API (Chrome/Edge):
new Actions(driver).scrollToElement(element).perform();
Scroll per pixel:
Perfetto per uno scrolling incrementale o per rifinire la posizione.
js.executeScript("window.scrollBy(0, 350)", "");
Usa valori positivi per scorrere verso il basso, negativi per scorrere verso l’alto.
Quando usare cosa?
- Preferisci lo scroll fino a un elemento per precisione e affidabilità.
- Usa lo scroll per pixel per carichi incrementali, effetti parallasse o quando vuoi simulare un comportamento simile a quello dell’utente.
Scorrere all’inizio/fine pagina e gestire lo scorrimento infinito
Scroll in fondo alla pagina:
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
Scroll in cima alla pagina:
js.executeScript("window.scrollTo(0, 0)");
Gestione dello scorrimento infinito:
Ti serve un ciclo: scorri, aspetta il nuovo contenuto, ripeti finché non ci sono più caricamenti.
long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
while (true) {
js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
Thread.sleep(2000); // Nei test reali usa explicit wait!
long newHeight = (Long) js.executeScript("return document.body.scrollHeight");
if (newHeight == lastHeight) break;
lastHeight = newHeight;
}
Questo pattern garantisce che tu carichi tutto il contenuto, proprio come farebbe un utente reale (Testsigma).
Scrolling personalizzato in Selenium con execute_script
Per qualsiasi cosa che vada oltre le basi, execute_script di JavaScript è il tuo migliore alleato. Puoi:
- Scorrere a piccoli passi per un comportamento fluido, simile a quello dell’utente.
- Attendere il caricamento dei contenuti dopo ogni scroll.
- Scorrere dentro contenitori specifici (come tabelle o caroselli).
- Gestire casi limite (ad es. sticky header, elementi dinamici).
Esempio: scrolling fluido a step
for i in range(10):
driver.execute_script("window.scrollBy(0, 500);")
time.sleep(0.5)
Esempio: attendere il contenuto dopo lo scroll
js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("new_element")));
Best practice:
- Abbina sempre gli scroll a explicit wait per il nuovo contenuto.
- Usa
{block: "center"}conscrollIntoViewper una migliore visibilità, se necessario. - Evita
sleephardcoded—usa attese legate ai cambiamenti reali del contenuto. - Per i contenitori, usa
element.scrollTop = ...oppureelement.scrollBy(...)via JS.
Ottimizzare lo scrolling in Selenium per browser diversi
Qui la situazione si fa interessante. Non tutti i browser gestiscono lo scrolling allo stesso modo:
- Chrome / Edge / altri browser basati su Chromium (Brave, Opera, Arc): supporto completo per l’input wheel dell’Actions API (
scrollToElement,scrollByAmount,scrollFromOrigin) e per JavaScript. - Firefox: lo scrolling via JavaScript funziona come previsto. L’input wheel dell’Actions API non è supportato da geckodriver — secondo la documentazione Selenium, le wheel actions sono solo per Chromium. Usa invece
JavascriptExecutor. - Safari: stessa situazione di Firefox — safaridriver non implementa l’endpoint wheel. Restare su
JavascriptExecutorearguments[0].scrollIntoView(...). - Modalità headless: imposta una dimensione esplicita della finestra (
driver.manage().window().setSize(...)oppure--window-size=1920,1080per Chrome). Senza questo, il viewport usa una dimensione piccola di default e contenuti che in un browser reale sarebbero fuori schermo potrebbero non attivare il lazy-load.
Suggerimenti:
- Testa la logica di scroll su tutti i browser target fin dall’inizio.
- Usa JavaScript come fallback universale per lo scrolling.
- Con gli sticky header, potresti dover scrollare qualche pixel in più o usare JavaScript personalizzato per evitare sovrapposizioni.
- In modalità headless, imposta la dimensione della finestra con
driver.manage().window().setSize(...)per garantire un comportamento coerente dello scroll.
Thunderbit: accelerare lo sviluppo dei test Selenium con scraping intelligente
Estrarre dati web dinamici con l'AI Get Started Free
Selenium guida il browser, ma non estrae i dati per te — sei tu a scrivere locator, cicli e asserzioni. Se la pagina che stai testando ha contenuti dinamici e pesanti in termini di scroll (griglie prodotto, feed social, tabelle lazy-loaded), Thunderbit è utile come strumento complementare: puntalo alla pagina, lascia che gestisca scroll e paginazione ed estragga un dataset strutturato, poi usa quel dataset come fonte di verità su cui il tuo test Selenium fa le asserzioni. È un modo più veloce per costruire la parte “attesa” del test rispetto a scrivere da zero uno scraper ad hoc.
Come Thunderbit completa Selenium:
- Estrai tutti i dati, anche dalle pagine a scorrimento infinito: l’AI di Thunderbit gestisce per te il ciclo di scroll e la paginazione, restituendo righe strutturate (nomi prodotto, prezzi, immagini) esportabili in CSV o Sheets.
- Genera dati di riferimento per i test: usa Thunderbit per raccogliere rapidamente tutti i dati UI attesi, poi fai in modo che il test Selenium scorra e verifichi che l’interfaccia corrisponda.
- Accelera lo sviluppo dei test: il “AI Suggerisci Campi” di Thunderbit può aiutarti a individuare selettori e struttura, rendendo più semplice scrivere i locator Selenium.
Flusso di lavoro di esempio:
- Usa Thunderbit per estrarre tutti i prodotti da una pagina e-commerce dinamica (scorrerà ed estrarrà tutto per te).
- Esporta i dati in Google Sheets o CSV.
- Nel tuo test Selenium, scorri la pagina, raccogli le informazioni visibili sui prodotti e confrontale con il dataset di Thunderbit.
- Verifica che tutti i prodotti siano presenti, caricati correttamente e che nessun dato manchi.
Questa combinazione significa che passerai meno tempo a scrivere codice di scraping fragile e più tempo a validare ciò che conta davvero. Le funzionalità di Thunderbit per lo scraping di sottopagine e per lo scraping pianificato sono particolarmente utili per siti grandi e dinamici.
Prova l'estensione Chrome di Thunderbit per uno scraping intelligente
Esempi pratici: scrolling efficiente in casi reali di test Selenium
Passiamo alla pratica. Ecco alcuni scenari reali e codice che puoi adattare:
1. Scorrere una tabella di grandi dimensioni
Supponiamo di avere una griglia dati con la propria barra di scorrimento:
WebElement table = driver.findElement(By.id("data-table"));
js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", table);
Porta la tabella fino in fondo. Se vuoi verificare ogni riga man mano che appare, fai un ciclo a incrementi.
2. Navigare feed a scorrimento infinito
prev_count = 0
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
posts = driver.find_elements(By.CSS_SELECTOR, ".post")
if len(posts) == prev_count:
break
prev_count = len(posts)
Carica tutti i post, fermandosi quando non ne compaiono di nuovi.
3. Verificare immagini lazy-loaded
List<WebElement> images = driver.findElements(By.tagName("img"));
for (WebElement img : images) {
if ("lazy".equals(img.getAttribute("loading"))) {
js.executeScript("arguments[0].scrollIntoView(true);", img);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(d -> (Boolean) ((JavascriptExecutor)d).executeScript("return arguments[0].complete && arguments[0].naturalWidth > 0;", img));
Assert.assertTrue((Integer) js.executeScript("return arguments[0].naturalWidth;", img) > 0);
}
}
Porta ogni immagine lazy in vista e verifica che sia stata caricata.
4. Scorrimento orizzontale in un carosello
WebElement carousel = driver.findElement(By.className("carousel"));
js.executeScript("arguments[0].scrollBy(300, 0);", carousel);
Scorre il carosello verso destra di 300px.
5. Rilevare errori di caricamento dei contenuti
Dopo ogni scroll, usa explicit wait per controllare la presenza di nuovi contenuti o di indicatori di caricamento. Se va in timeout, registra lo stato e segnala il fallimento.
Guida passo passo: implementare uno scrolling efficiente in Selenium
Scopri di più sulle best practice per il data scraping Get Started Free
Ecco la tua checklist operativa:
- Individua quando serve lo scrolling: il contenuto è nascosto, lazy-loaded o paginato?
- Assicurati della presenza dell’elemento: usa explicit wait per confermare che gli elementi esistano nel DOM.
- Scegli il metodo di scroll giusto:
- Scroll fino all’elemento per la precisione.
- Scroll per pixel per carichi incrementali.
- Ciclo per lo scorrimento infinito.
- Implementa lo scrolling: usa JavaScript o Actions API, a seconda dei casi.
- Sincronizza dopo ogni scroll: attendi che il nuovo contenuto venga caricato—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 dei dati: usa Thunderbit per pre-caricare o validare dataset di grandi dimensioni.
- Riduci lo scrolling non necessario: scorri solo quanto serve.
- Documenta la logica: commenta perché hai scelto ciascun approccio di scroll.
| Passo | Azione chiave |
|---|---|
| Identifica il bisogno | Lo scrolling è richiesto in questo scenario? |
| Presenza elemento | Attendi che gli elementi esistano nel DOM |
| Scegli il metodo | Elemento, pixel, ciclo o scroll del contenitore |
| Implementa | Usa JS/Actions/Tasti secondo necessità |
| Sincronizza | Attendi il contenuto dopo ogni scroll |
| Valida | Verifica visibilità e correttezza |
| Ottimizza browser | Testa su Chrome, Firefox, Edge, Safari |
| Integra Thunderbit | Usalo per estrazione/validazione dati |
| Riduci | Evita scroll ridondanti |
| Documenta | Commenta e spiega l’approccio |
Conclusione e punti chiave
Uno scrolling efficiente in Selenium è la base di un’automazione dei test web moderna e robusta. Con contenuti dinamici e scrolling infinito ovunque, i tuoi test devono scorrere come un utente reale per validare davvero la UI. Ecco cosa conta di più:
- Scorri con uno scopo: individua quando e dove serve lo scrolling—non limitarti a sperare che gli elementi siano visibili.
- Usa gli strumenti giusti: preferisci lo scroll fino all’elemento per precisione, JavaScript per flessibilità e Actions API per il comportamento nativo (dove supportato).
- Sincronizza e verifica: aspetta sempre il caricamento del contenuto dopo lo scroll e verifica che sia visibile e corretto.
- Ottimizza per tutti i browser: testa la tua logica di scrolling ovunque e usa JavaScript come fallback universale.
- Sfrutta Thunderbit: combina Selenium con Thunderbit per accelerare l’estrazione e la validazione dei dati—soprattutto su pagine dinamiche o con molto scrolling.
Pronto a fare un salto di livello nei tuoi test Selenium? Prova a integrare la Chrome Extension di Thunderbit per uno sviluppo dei test più intelligente e veloce. E se vuoi altri consigli sull’automazione, dai un’occhiata al Thunderbit Blog per approfondimenti e tutorial.
Accelera i test Selenium con Thunderbit
Buono scrolling—e che i tuoi test trovino sempre ciò che stanno cercando.
FAQ
1. Perché Selenium a volte non riesce a interagire con elementi presenti nel DOM?
Perché Selenium non porta automaticamente gli elementi in vista. Se un elemento è fuori schermo, potresti ricevere una ElementNotInteractableException. Usa azioni di scroll per assicurarti che gli elementi siano visibili prima di interagire.
2. Qual è il modo migliore per gestire le pagine a scorrimento infinito in Selenium?
Usa un ciclo: scorri in fondo, attendi il caricamento di nuovo contenuto e ripeti finché non compare più nulla. Usa sempre explicit wait legati ai cambiamenti del contenuto, non sleep fissi.
3. Come faccio a far funzionare il codice di scrolling su tutti i browser?
execute_script di JavaScript è il metodo più universale. L’Actions API funziona bene su Chrome/Edge, ma potrebbe non essere supportata su Safari o nelle vecchie versioni di Firefox. Testa sempre la logica su tutti i browser target.
4. Posso scorrere dentro contenitori o tabelle, non solo nella pagina principale?
Sì! Usa JavaScript per impostare scrollTop o scrollBy sull’elemento contenitore. Per esempio: js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", tableElement);
5. In che modo Thunderbit aiuta nell’automazione dei test Selenium?
Lo scraping con AI di Thunderbit può estrarre tutti i dati da pagine dinamiche o a scorrimento infinito, fornendo dataset di riferimento per i tuoi test Selenium. Questo rende più semplice validare i contenuti UI e accelera lo sviluppo dei test—soprattutto per siti complessi e ricchi di dati.
6. Nel 2026 devo ancora scrivere a mano il codice di scroll, o Selenium ha raggiunto l’auto-scroll di Playwright?
Playwright e le versioni recenti di Cypress portano automaticamente gli elementi in vista prima di interagirci — Selenium WebDriver invece no, e non ci sono segnali che la situazione cambi nella linea 4.x. Quindi sì, con Selenium lo scroll lo scrivi ancora tu (Actions API su Chromium, JavascriptExecutor ovunque altrove). Se stai iniziando da zero una nuova suite di test e il team non ha già investito su Selenium, l’auto-scroll è uno dei motivi reali per cui molti scelgono Playwright. Se invece stai mantenendo una suite Selenium esistente — come fa la maggior parte dei team — gli approcci di questa guida restano la risposta giusta.
Per saperne di più su Selenium, web scraping e best practice di automazione, visita il Thunderbit Blog.
Prova AI Web Scraper per pagine dinamiche Get Started Free


