Als je ooit hebt geprobeerd een moderne webapp te automatiseren, ken je de frustratie: je schrijft een Selenium-test, die klikt op een knop, en—bam—er gebeurt niets. Blijkt dat de knop net buiten beeld stond, of dat de pagina nog extra producten aan het laden was terwijl je scrolde. Welkom in de wereld van dynamische webpagina’s met oneindig scrollen, waar je tests laten “zien” wat een echte gebruiker ziet al de helft van de strijd is. Ik werk al jaren aan webautomatisering en kan je dit vertellen: efficiënt scrollen in Selenium is niet zomaar een nice-to-have — het is het verschil tussen instabiele, onbetrouwbare tests en robuuste automatisering die klaar is voor productie.
Laten we induiken in waarom scrollen in Selenium zo belangrijk is, de beste technieken voor alles van lazy-loaded lijsten tot sticky headers, en hoe tools zoals Thunderbit je workflow een enorme boost kunnen geven. Ik deel praktische code, browserspecifieke tips en een paar lessen uit de praktijk — zodat je kunt stoppen met vechten tegen je tests en kunt beginnen met vertrouwen op je resultaten.
De basis van scrollen in Selenium begrijpen
Wat betekent “scrollen in Selenium” eigenlijk? Bij webautomatisering gaat het erom dat je programmatisch het viewport van de browser verplaatst — omhoog, omlaag, naar links, naar rechts of naar een specifiek element — zodat de content waarmee je wilt werken ook echt zichtbaar is. Selenium WebDriver scrolt standaard niet voor je. Als je probeert te klikken op een element dat buiten beeld staat, krijg je vaak de gevreesde ElementNotInteractableException (GeeksforGeeks). Daarom is precies en bewust scrollen onmisbaar voor betrouwbare UI-testautomatisering. Alles in deze gids is gericht op de Selenium 4.x-lijn — de wheel-/scroll-input werd geïntroduceerd in Selenium 4.2 en is nog steeds de huidige manier om het te doen in de nieuwste 4.43-release (Selenium downloads). Als je nog op Selenium 3 zit, compileren de snippets met de Actions API niet en moet je terugvallen op de JavascriptExecutor-patronen die later worden getoond.
Dit zijn de belangrijkste scrollacties die je in Selenium gebruikt:
- Verticaal scrollen: de pagina omhoog of omlaag verplaatsen om meer content zichtbaar te maken.
- Horizontaal scrollen: handig voor brede tabellen of carrousels.
- Naar een element scrollen: een specifiek element in beeld brengen, meestal met
scrollIntoView. - Scrollen per pixels: het viewport een bepaald aantal pixels verschuiven — handig voor incrementeel scrollen.
- Naar boven/onder scrollen: direct naar het begin of einde van een pagina springen.
Waarom is dit belangrijk? Omdat webpagina’s tegenwoordig vol zitten met dynamische elementen — denk aan feeds met oneindig scrollen, knoppen “Meer laden”, sticky headers en lazy-loaded afbeeldingen. Als je test niet kan scrollen, kan die de helft van de UI niet zien (of verifiëren). En dan glippen bugs erdoorheen, of falen je tests om de verkeerde redenen (BrowserStack).
Veelvoorkomende valkuilen:
- Een element vinden betekent niet dat het zichtbaar of klikbaar is.
- Acties zoals
.click()of.sendKeys()scrollen niet automatisch naar het element. - Vaste headers kunnen elementen bedekken, zelfs na scrollen.
- Pagina’s met oneindig scrollen vereisen herhaald, stapsgewijs scrollen om alle content te laden.
Hier is een kort Java-voorbeeld om een element in beeld te brengen:
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
Zo weet je zeker dat je doel-element zichtbaar is bovenaan het viewport — geen “element not interactable”-fouten meer.
Waarom efficiënt scrollen in Selenium belangrijk is voor webtesten
Laten we eerlijk zijn: de meeste moderne webapps vertrouwen op dynamische content die pas verschijnt nadat je scrolt. Volgens recente data gebruiken meer dan 516.000 live websites oneindig scrollen alleen al via jQuery, en het echte aantal ligt waarschijnlijk nog veel hoger. Als je Selenium-tests nooit scrollen, mis je een enorm deel van je applicatie.
Waar scrollen nodig is:
- Lijsten met oneindig scrollen/lazy loading: sociale feeds, productoverzichten, SaaS-dashboards.
- Knoppen “Meer laden”: e-commerce-, nieuws- en bedrijvengidswebsites.
- Verborgen knoppen of links: elementen die pas verschijnen nadat je scrolt.
- Sticky headers: kunnen elementen afdekken, waardoor nauwkeurige scrollpositie nodig is.
- Grote tabellen of carrousels: hebben vaak horizontaal scrollen of scrollen binnen een container nodig.
| Testsituatie | Waarom scrollen nodig is |
|---|---|
| Feed met oneindige content (bijv. sociale media) | Nieuwe berichten laden terwijl je scrolt. Tests moeten herhaald scrollen om alle items te laden en te verifiëren. |
| Paginering met “Meer laden” | Extra items zitten pas in de DOM nadat je scrolt/klikt. |
| Lazy-loaded afbeeldingen | Afbeeldingen laden alleen wanneer ze in beeld komen — tests moeten scrollen om te controleren of alles aanwezig en geladen is. |
| Sticky header overlapt content | Elementen kunnen onder headers verdwijnen — scrollen moet hier rekening mee houden. |
| Grote scrollbare tabellen/carrousels | Slechts een deel van de content is tegelijk zichtbaar; tests moeten scrollen om alle rijen/items te bereiken en valideren. |
ROI:
- Betere testdekking: je valideert alle UI-elementen, niet alleen wat zichtbaar is bij het laden.
- Minder handmatig werk: geen tests meer splitsen of handmatig content zichtbaar maken.
- Betrouwbaardere automatisering: minder false negatives door fouten als “element not found” of “not interactable”.
Stel je een e-commercewebsite voor met 100 producten, maar er laden er telkens maar 20. Een test zonder scrollen controleert slechts 20% van je catalogus — en laat 80% ongetest. Efficiënt scrollen betekent dat je sneller meer bugs vindt.

Alle manieren om te scrollen: Selenium-scrolltechnieken vergeleken
Selenium heeft niet één enkel commando als “scrollDown()”, maar biedt wel meerdere manieren om hetzelfde doel te bereiken. Hier is een kort overzicht:
| Methode | Browserondersteuning | Complexiteit | Beste gebruiksscenario |
|---|---|---|---|
| Actions API (Wheel-input) | Chrome, Edge (Selenium 4) | Gemiddeld | Native, nauwkeurig scrollen naar element of met offset |
| JavaScriptExecutor | Alle browsers | Makkelijk | Scrollen naar element, per pixels of naar pagina-einden |
| Toetsenbordtoetsen (Page Down, enz.) | Alle browsers | Makkelijk | User-achtige scrollactie simuleren |
| Scrollen binnen elementen | Alle browsers | Gemiddeld | Scrollen binnen containers, tabellen, carrousels |
Naar elementen en per pixels scrollen
Naar een element scrollen:
Het beste wanneer je precies weet wat je zichtbaar wilt maken.
js.executeScript("arguments[0].scrollIntoView();", webElement);
Of, met de Selenium 4 Actions API (Chrome/Edge):
new Actions(driver).scrollToElement(element).perform();
Per pixels scrollen:
Geweldig voor incrementeel scrollen of het fijn afstellen van de positie.
js.executeScript("window.scrollBy(0, 350)", "");
Gebruik positieve waarden om omlaag te scrollen, negatieve om omhoog te scrollen.
Wanneer gebruik je wat?
- Kies bij voorkeur scroll-to-element voor precisie en betrouwbaarheid.
- Gebruik scroll-by-pixels voor incrementele loads, parallax-effecten of wanneer je user-achtig scrollen wilt simuleren.
Naar boven/onder scrollen en oneindig scrollen afhandelen
Naar onder scrollen:
js.executeScript("window.scrollTo(0, document.body.scrollHeight)");
Naar boven scrollen:
js.executeScript("window.scrollTo(0, 0)");
Oneindig scrollen afhandelen:
Je hebt een lus nodig: scrollen, wachten op nieuwe content, herhalen totdat er niets meer laadt.
long lastHeight = (Long) js.executeScript("return document.body.scrollHeight");
while (true) {
js.executeScript("window.scrollTo(0, document.body.scrollHeight);");
Thread.sleep(2000); // Gebruik in echte tests expliciete waits!
long newHeight = (Long) js.executeScript("return document.body.scrollHeight");
if (newHeight == lastHeight) break;
lastHeight = newHeight;
}
Dit patroon zorgt ervoor dat je alle content laadt, net zoals een echte gebruiker zou doen (Testsigma).
Aangepast scrollen in Selenium met execute_script
Voor alles wat verder gaat dan de basis is JavaScript’s execute_script je beste vriend. Je kunt:
- In stappen scrollen voor vloeiend, user-achtig gedrag.
- Na elke scroll wachten tot content geladen is.
- Binnen specifieke containers scrollen (zoals tabellen of carrousels).
- Randgevallen afhandelen (bijv. sticky headers, dynamische elementen).
Voorbeeld: vloeiend, stapsgewijs scrollen
for i in range(10):
driver.execute_script("window.scrollBy(0, 500);")
time.sleep(0.5)
Voorbeeld: wachten op content na scrollen
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 practices:
- Koppel scrollacties altijd aan expliciete waits voor nieuwe content.
- Gebruik
{block: "center"}metscrollIntoViewvoor betere zichtbaarheid indien nodig. - Vermijd hardcoded sleeps — gebruik waits die gekoppeld zijn aan echte contentwijzigingen.
- Gebruik voor containers via JS
element.scrollTop = ...ofelement.scrollBy(...).
Scrollen in Selenium optimaliseren voor verschillende browsers
Hier wordt het interessant. Niet elke browser gaat hetzelfde om met scrollen:
- Chrome / Edge / andere op Chromium gebaseerde browsers (Brave, Opera, Arc): volledige ondersteuning voor de wheel-input van de Actions API (
scrollToElement,scrollByAmount,scrollFromOrigin) en JavaScript. - Firefox: JavaScript-scrollen werkt zoals verwacht. De wheel-input van de Actions API wordt niet ondersteund door geckodriver — volgens de Selenium-documentatie zijn wheel-acties alleen voor Chromium. Gebruik in plaats daarvan
JavascriptExecutor. - Safari: hetzelfde als Firefox — safaridriver implementeert het wheel-endpoint niet. Blijf bij
JavascriptExecutorenarguments[0].scrollIntoView(...). - Headless-modus: stel een expliciete venstergrootte in (
driver.manage().window().setSize(...)of--window-size=1920,1080voor Chrome). Zonder dat krijgt het viewport een kleine standaardgrootte, en content die in een echte browser buiten beeld zou vallen, triggert mogelijk geen lazy load.
Tips:
- Test je scroll-logica vroeg op alle doelbrowsers.
- Gebruik JavaScript als universele fallback voor scrollen.
- Bij sticky headers moet je soms een paar extra pixels scrollen of aangepaste JS gebruiken om overlap te voorkomen.
- Stel in headless-modus de venstergrootte in met
driver.manage().window().setSize(...)voor consistent scrollgedrag.
Thunderbit: Selenium-testontwikkeling versnellen met slim scrapen
Dynamische webdata scrapen met AI Get Started Free
Selenium bedient de browser, maar haalt geen data voor je op — jij schrijft de locators, de lussen en de asserts. Als de pagina die je test dynamische, scroll-intensieve content heeft (productoverzichten, sociale feeds, lazy-loaded tabellen), is Thunderbit handig als metgezel: wijs het naar de pagina, laat het scrollen + pagineren + een gestructureerde dataset extraheren, en gebruik die dataset als de bron van waarheid waartegen je Selenium-test controleert. Dat is een snellere manier om de “verwachte” kant van je test op te bouwen dan zelf een eenmalige scraper te schrijven.
Hoe Thunderbit Selenium aanvult:
- Scrape alle data, ook van pagina’s met oneindig scrollen: Thunderbit’s AI handelt de scroll-lus en paginering voor je af en geeft gestructureerde rijen terug (productnamen, prijzen, afbeeldingen) die je kunt exporteren naar CSV of Sheets.
- Genereer referentiedata voor je tests: gebruik Thunderbit om snel alle verwachte UI-data te verzamelen, en laat je Selenium-test vervolgens scrollen en verifiëren dat de UI overeenkomt.
- Testontwikkeling versnellen: Thunderbit’s “AI Suggest Fields” kan je helpen selectors en structuur te identificeren, waardoor het makkelijker wordt om Selenium-locators te schrijven.
Voorbeeldworkflow:
- Gebruik Thunderbit om alle producten van een dynamische e-commercepagina te scrapen (het scrollt en extraheert alles voor je).
- Exporteer de data naar Google Sheets of CSV.
- In je Selenium-test scroll je door de pagina, verzamel je de zichtbare productinformatie en vergelijk je die met de Thunderbit-dataset.
- Controleer dat alle producten aanwezig zijn, correct geladen zijn en dat er geen data ontbreekt.
Deze combinatie zorgt ervoor dat je minder tijd kwijt bent aan kwetsbare scrapingcode en meer tijd besteedt aan het valideren van wat er echt toe doet. Thunderbit’s subpage scraping en scheduled scraping-functies zijn vooral handig voor grote, dynamische websites.
Probeer de Thunderbit Chrome-extensie voor slim scrapen
Praktische voorbeelden: efficiënt scrollen in echte Selenium-tests
Laten we praktisch worden. Hier zijn een paar realistische scenario’s en code die je kunt aanpassen:
1. Door een grote tabel scrollen
Stel dat je een datagrid hebt met een eigen scrollbalk:
WebElement table = driver.findElement(By.id("data-table"));
js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", table);
Scrolt naar de onderkant van de tabel. Gebruik een lus in stappen als je elke rij wilt valideren zodra die verschijnt.
2. Navigeren door feeds met oneindig scrollen
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)
Laadt alle posts en stopt wanneer er geen nieuwe meer verschijnen.
3. Lazy-loaded afbeeldingen valideren
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);
}
}
Scrolt elke lazy image in beeld en controleert of die geladen is.
4. Horizontaal scrollen in een carrousel
WebElement carousel = driver.findElement(By.className("carousel"));
js.executeScript("arguments[0].scrollBy(300, 0);", carousel);
Scrolt de carrousel 300px naar rechts.
5. Mislukte contentlaad-acties detecteren
Gebruik na elke scroll expliciete waits om nieuwe content of laadspinners te controleren. Als een timeout optreedt, log dan de status en markeer de test als mislukt.
Stapsgewijze handleiding: efficiënt scrollen implementeren in Selenium
Lees meer over best practices voor data scraping Get Started Free
Hier is je praktische checklist:
- Bepaal wanneer scrollen nodig is: is content verborgen, lazy-loaded of gepagineerd?
- Zorg dat het element aanwezig is: gebruik expliciete waits om te bevestigen dat elementen in de DOM bestaan.
- Kies de juiste scrollmethode:
- Scroll-to-element voor precisie.
- Scroll-by-pixels voor incrementele loads.
- Een lus voor oneindig scrollen.
- Implementeer het scrollen: gebruik JavaScript of de Actions API waar passend.
- Synchroniseer na elke scroll: wacht tot nieuwe content geladen is — vertrouw niet op vaste sleeps.
- Valideer de content: controleer na het scrollen of elementen zichtbaar, geladen en interacteerbaar zijn.
- Optimaliseer voor browsers: test op alle doelbrowsers; gebruik JS als fallback.
- Integreer Thunderbit voor data-extractie: gebruik Thunderbit om grote datasets vooraf op te halen of te valideren.
- Minimaliseer onnodig scrollen: scroll alleen zoveel als nodig is.
- Documenteer je logica: zet in commentaar waarom je voor een bepaalde scrollaanpak hebt gekozen.
| Stap | Belangrijke actie |
|---|---|
| Noodzaak bepalen | Is scrollen nodig voor dit scenario? |
| Element aanwezig | Wacht tot elementen in de DOM bestaan |
| Methode kiezen | Element, pixels, lus of container-scroll |
| Implementeren | Gebruik JS/Actions/toetsen indien nodig |
| Synchroniseren | Wacht op content na elke scroll |
| Valideren | Controleer zichtbaarheid en correctheid |
| Browser-optimalisatie | Test in Chrome, Firefox, Edge, Safari |
| Thunderbit integreren | Gebruik voor data-extractie/validatie |
| Minimaliseren | Vermijd dubbele scrollacties |
| Documenteren | Voeg commentaar toe en leg de aanpak uit |
Conclusie en belangrijkste inzichten
Efficiënt scrollen in Selenium is de ruggengraat van robuuste, moderne testautomatisering voor webapps. Met dynamische content en oneindig scrollen overal om ons heen moeten je tests scrollen zoals een echte gebruiker om je UI echt te valideren. Dit is het belangrijkste:
- Scroll met een doel: bepaal wanneer en waar scrollen nodig is — ga niet zomaar uit van zichtbaarheid.
- Gebruik de juiste tools: kies bij voorkeur scroll-to-element voor precisie, JavaScript voor flexibiliteit en de Actions API voor native gedrag (waar ondersteund).
- Synchroniseer en verifieer: wacht na het scrollen altijd tot content geladen is en controleer of die zichtbaar en correct is.
- Optimaliseer voor alle browsers: test je scroll-logica overal en gebruik JavaScript als universele fallback.
- Benut Thunderbit: combineer Selenium met Thunderbit om data-extractie en validatie te versnellen — vooral voor scroll-intensieve of dynamische pagina’s.
Klaar om je Selenium-tests naar een hoger niveau te tillen? Probeer Thunderbit’s Chrome-extensie voor slimmere en snellere testontwikkeling. En als je meer automatiseringstips wilt, bekijk dan de Thunderbit Blog voor diepgaande uitleg en tutorials.
Versnel Selenium-tests met Thunderbit
Veel scrollplezier — en moge je tests altijd vinden wat ze zoeken.
FAQ’s
1. Waarom lukt het Selenium soms niet om te interageren met elementen die wel in de DOM staan?
Omdat Selenium elementen niet automatisch in beeld brengt. Als een element buiten beeld staat, kun je een ElementNotInteractableException krijgen. Gebruik scrollacties om ervoor te zorgen dat elementen zichtbaar zijn voordat je ermee werkt.
2. Wat is de beste manier om pagina’s met oneindig scrollen in Selenium af te handelen?
Gebruik een lus: scroll naar beneden, wacht tot nieuwe content geladen is en herhaal totdat er geen content meer verschijnt. Gebruik altijd expliciete waits die gekoppeld zijn aan contentwijzigingen, niet vaste sleeps.
3. Hoe zorg ik dat mijn scrollcode in alle browsers werkt?
JavaScript’s execute_script is de meest universele methode. De Actions API werkt goed in Chrome/Edge, maar wordt mogelijk niet ondersteund in Safari of oudere Firefox-versies. Test je logica altijd op alle doelbrowsers.
4. Kan ik ook binnen containers of tabellen scrollen, niet alleen op de hoofdpagina?
Ja! Gebruik JavaScript om scrollTop of scrollBy op het containerelement in te stellen. Bijvoorbeeld: js.executeScript("arguments[0].scrollTop = arguments[0].scrollHeight", tableElement);
5. Hoe helpt Thunderbit bij Selenium-testautomatisering?
Thunderbit’s AI-gestuurde scraping kan alle data van dynamische of oneindig-scrollende pagina’s extraheren en zo referentiedatasets leveren voor je Selenium-tests. Daardoor kun je UI-content makkelijker valideren en testontwikkeling versnellen — vooral bij complexe sites met veel data.
6. Moet ik in 2026 nog steeds handmatig scrollcode schrijven, of heeft Selenium Playwright’s auto-scroll ingehaald?
Playwright en recente Cypress-versies scrollen elementen automatisch in beeld voordat ze ermee interageren — Selenium WebDriver doet dat nog steeds niet, en er is geen signaal dat dit in de 4.x-lijn verandert. Dus ja, in Selenium schrijf je het scrollen nog steeds zelf (Actions API op Chromium, JavascriptExecutor overal elders). Als je vanaf nul een nieuwe testsuite opzet en je team nog geen Selenium-investering heeft, is het auto-scroll-gedrag een van de echte redenen waarom mensen voor Playwright kiezen. Beheer je een bestaande Selenium-suite — wat voor de meeste teams geldt — dan zijn de patronen in deze gids nog steeds de juiste oplossing.
Voor meer over Selenium, web scraping en best practices voor automatisering, bezoek de Thunderbit Blog.
Probeer AI-webscraper voor dynamische pagina’s Get Started Free


