Best practices

  • Use Keys.PAGE_DOWN and Keys.PAGE_UP to mimic user interaction. This is particularly helpful for sites that load content or trigger events on keyboard input.

  • Employ `driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")` to scroll directly to the bottom of the page, ensuring you reach all content loaded dynamically.

  • Utilize `driver.execute_script("window.scrollTo(0, 0);")` to return to the top of the page, which is effective for resetting the view after extensive page navigation.

  • To focus on a specific element, use `driver.execute_script("arguments[0].scrollIntoView();", element)` which aligns the element to the visible area of the browser window, enhancing element interaction reliability.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
# Set up Chrome driver
options = Options()
options.add_argument("--start-maximized")
service = Service()  # Optional: specify path to chromedriver if needed
driver = webdriver.Chrome(service=service, options=options)

# Open the target website
driver.get("https://sandbox.oxylabs.io/products")

# Allow time for the page to load
time.sleep(2)

# Scroll down using PAGE_DOWN key
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_DOWN)
time.sleep(1)

# Scroll up using PAGE_UP key
driver.find_element(By.TAG_NAME, 'body').send_keys(Keys.PAGE_UP)
time.sleep(1)

# Scroll to the bottom using JavaScript
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

# Scroll to the top using JavaScript
driver.execute_script("window.scrollTo(0, 0);")
time.sleep(1)

# Scroll to a specific element (replace 'specificElementId' with actual ID)
try:
    element = driver.find_element(By.ID, 'specificElementId')
    driver.execute_script("arguments[0].scrollIntoView();", element)
    time.sleep(1)
except:
    print("Element not found.")

# Close the browser
driver.quit()

Common issues

  • Trying to scroll to an element that hasn’t loaded yet will raise a NoSuchElementException. Always wait for the element to appear before interacting with it.

  • Scrolling instantly to the bottom using JavaScript can skip over dynamically loaded content. Instead, scroll in smaller steps to mimic human behavior.

  • When using `Keys.PAGE_DOWN` or `Keys.PAGE_UP`, verify that the focus is on a scrollable area or element to prevent ineffective scrolling actions.

  • Pages that load content on scroll require checks after each scroll to confirm all necessary elements have appeared.

# Incorrect: Trying to scroll to an element that might not be loaded yet
# element = driver.find_element_by_id('dynamicElementId')
# driver.execute_script("arguments[0].scrollIntoView();", element)

# Correct: Wait for the element to be visible before scrolling
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.ID, 'dynamicElementId')))
driver.execute_script("arguments[0].scrollIntoView();", element)

# Incorrect: Scrolling too quickly to the bottom of the page
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Correct: Scroll gradually to simulate human behavior
scroll_height = driver.execute_script("return document.body.scrollHeight")
for i in range(0, scroll_height, 200):
    driver.execute_script(f"window.scrollTo(0, {i});")
    time.sleep(0.2)

# Incorrect: Using PAGE_DOWN without setting focus
# driver.send_keys(Keys.PAGE_DOWN)

# Correct: Ensure the scrollable element is focused
body = driver.find_element(By.TAG_NAME, 'body')
body.click()
body.send_keys(Keys.PAGE_DOWN)

# Incorrect: Assuming all content loads after one scroll
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Correct: Scroll and check for additional content dynamically
previous_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)  # Give time for new content to load
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == previous_height:
        break
    previous_height = new_height
driver.quit()

Try Oxylabs' Proxies & Scraper API

Residential Proxies

Self-Service

Human-like scraping without IP blocking

From

8

Datacenter Proxies

Self-Service

Fast and reliable proxies for cost-efficient scraping

From

1.2

Web scraper API

Self-Service

Public data delivery from a majority of websites

From

49

Useful resources

Advanced Web Scraping With Python Tactics in 2025
vytenis kaubre avatar

Vytenis Kaubrė

2025-01-01

Web Scraping with Selenium and Python
Gabija Fatenaite avatar

Gabija Fatenaite

2024-06-13

How to Scrape Dynamic Websites With Python
Enrika avatar

Enrika Pavlovskytė

2023-10-12

Get the latest news from data gathering world

I'm interested