Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Short answer: Selenium’s standard element-screenshot command captures only the visible region inside the element’s bounding rectangle. It does not automatically render every pixel of a tall element outside the viewport. To capture an element taller than the monitor, take overlapping screenshots while scrolling the element’s actual scroll container, then stitch the PNG segments. The method below shows a complete Selenium/Python implementation and explains where it can fail.

What Selenium actually captures

The W3C WebDriver specification defines the “Take Element Screenshot” command as taking “a screenshot of the visible region encompassed by the bounding rectangle of an element.” That wording is important: the endpoint is viewport-based, not a promise to expand a page or element to unlimited height. See the W3C WebDriver specification.

Selenium bindings expose convenient methods such as Python’s WebElement.screenshot(filename), PNG bytes and base64 properties. Those methods save the currently visible element image; they do not add a documented full-content mode. The Selenium Python WebElement API documents the output methods.

Increasing the browser window can expose more pixels, but only content that fits in that larger viewport becomes visible. It is not a general solution for arbitrarily tall elements. Selenium’s window and screenshot examples are documented in the window and screenshot documentation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
Philips 24 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 241V8LB
  • CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
  • WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
  • A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents

Choose the correct capture target

One element in the document flow

If the page itself scrolls, scroll the document until the target’s successive portions are visible. The element may be visually long even though only one viewport-height portion can be captured at once.

An element inside a nested scroll panel

Many dashboards have a fixed-height panel with overflow:auto. In that case, the panel—not the document—owns the hidden pixels. Scrolling window will not reveal content inside the panel. You must change that panel’s scrollTop (and, for wide content, scrollLeft).

The entire page

A full document screenshot is a different requirement from a full element screenshot. Playwright documents a separate fullPage option for the scrollable page, alongside element screenshots; that option belongs to Playwright and should not be assumed to exist in Selenium’s WebElement endpoint. See Playwright’s screenshot documentation.

Reliable Selenium workflow

  1. Find the owner of overflow. Inspect the target and its ancestors. Look for a scrollable ancestor whose scrollHeight exceeds clientHeight. If none exists, the document is usually the scrolling surface.
  2. Measure before moving. Record the target’s bounding rectangle and the container’s client and scroll dimensions with JavaScript. Distinguish the element’s full content dimensions from the visible rectangle; CSS transforms, padding and borders can affect the numbers.
  3. Stabilize the page. Wait for fonts, images and asynchronous data. Disable or pause animations where possible. If content is lazy-loaded, allow each newly exposed region to finish loading before taking its tile.
  4. Capture an initial tile. Bring the target into view, then call the binding’s element screenshot method and save PNG bytes.
  5. Scroll by less than one viewport. Use an overlap (for example, 40–100 CSS pixels) so seams can be aligned and no line of text is lost at a boundary.
  6. Repeat to the end. Continue until the scroll position reaches the maximum. Store each scroll offset with its image; do not rely only on tile index when a browser clamps the final scroll.
  7. Crop and stitch. Remove duplicated overlap rows and concatenate tiles in scroll order. For horizontal or two-dimensional content, create overlapping columns and rows and place them using both offsets.
  8. Validate. Check the bottom, borders, sticky headers, lazy-loaded images and text at every seam. Keep browser, driver, Selenium version, viewport and scroll-container details with the artifact.

Python example: capture and stitch a tall element

The following example assumes a nested panel selected by #results-panel and a target inside it selected by .long-report. It uses Pillow for stitching (pip install selenium pillow). Adjust selectors and the overlap for your page.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Philips 22 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 221V8LB
  • CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
  • SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
from io import BytesIO
from pathlib import Path
import time

from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

URL = "https://example.com/report"
CONTAINER = "#results-panel"
TARGET = ".long-report"
OVERLAP = 80  # CSS pixels; increase if seams are difficult to align
OUT = Path("full-element.png")

options = webdriver.ChromeOptions()
options.add_argument("--window-size=1440,1000")
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 30)

try:
    driver.get(URL)
    container = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, CONTAINER)))
    target = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, TARGET)))

    # Put the target near the top of its scrolling panel.
    driver.execute_script("""
        const c = arguments[0], t = arguments[1];
        c.scrollTop = Math.max(0, t.offsetTop - 8);
    """, container, target)

    tiles = []
    offsets = []
    last = None

    while True:
        # Let layout, lazy images and fonts settle after every scroll.
        time.sleep(0.15)
        png = target.screenshot_as_png
        tiles.append(Image.open(BytesIO(png)).convert("RGBA"))
        top = driver.execute_script("return arguments[0].scrollTop", container)
        offsets.append(top)

        maximum, viewport = driver.execute_script("""
            const c = arguments[0];
            return [c.scrollHeight - c.clientHeight, c.clientHeight];
        """, container)
        if top >= maximum or top == last:
            break
        last = top
        step = max(1, viewport - OVERLAP)
        driver.execute_script("arguments[0].scrollTop += arguments[1]", container, step)

    # A simple vertical stitch. The final tile may overlap by less than OVERLAP
    # because browsers clamp the final scroll position.
    if not tiles:
        raise RuntimeError("No screenshot tiles were captured")
    width = max(tile.width for tile in tiles)
    height = tiles[0].height
    canvas = Image.new("RGBA", (width, height + sum(max(1, t.height - OVERLAP) for t in tiles[1:])), "white")
    y = 0
    canvas.paste(tiles[0], (0, y))
    y += tiles[0].height
    for tile in tiles[1:]:
        crop = tile.crop((0, min(OVERLAP, tile.height), tile.width, tile.height))
        canvas.paste(crop, (0, y))
        y += crop.height
    canvas.crop((0, 0, width, y)).save(OUT)
    print(f"wrote {OUT} from offsets {offsets}")
finally:
    driver.quit()

This example deliberately uses a conservative fixed overlap. For production captures, derive each tile’s crop from the measured change in scroll offset and the element’s screen position. That handles a final clamped scroll and pages where the element’s visible height changes. If the element itself is the scroll container, pass the element as container and choose a descendant as target, or capture the container directly when its own screenshot is the desired image.

Handling a document that scrolls

When the body is the scrolling surface, replace the panel operations with window.scrollTo and read document.documentElement.scrollHeight and window.innerHeight. Keep the target aligned before each shot:

driver.execute_script("arguments[0].scrollIntoView({block: 'start'});", target)
for y in range(0, total_height, viewport_height - OVERLAP):
    driver.execute_script("window.scrollTo(0, arguments[0]);", y)
    time.sleep(0.2)
    png = target.screenshot_as_png

Do not assume the loop’s requested offset equals the browser’s actual offset. Read it back after scrolling and stop when the maximum is reached. Fixed navigation bars can cover the top of every tile; hide them temporarily with CSS or crop their repeated area before stitching.

Wide elements and two-dimensional tiling

For content wider than the viewport, capture a grid. Scroll vertically and horizontally by less than the visible width and height, recording each pair of offsets. Stitch each row horizontally, then stitch the rows vertically. Use the same overlap on both axes, but verify that horizontal scrollbars, right-side sticky columns and RTL layouts do not duplicate content. A retina device scale changes pixel dimensions even when CSS measurements stay the same, so calculate crop sizes from the returned image and actual offset deltas rather than assuming one CSS pixel equals one image pixel.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Common failure modes and fixes

Only the visible portion appears

That is the documented WebDriver behavior. Use tiled scrolling and stitching; there is no standard WebElement flag that expands the capture beyond the viewport.

Rank #3
Dell 24 Monitor - SE2426H - 23.8-inch FHD (1920x1080) 144Hz 1ms Display, in-Plane Switching (IPS) Technology, AMD FreeSync™, TÜV 3-Star 2X HDMI, Tilt
  • Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
  • Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
  • Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
  • In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
  • Ultra-thin bezels: Maximize your viewing experience with thin bezels.

The image repeats or has missing bands

The scroll step, overlap and crop do not match. Record actual offsets, reduce the step, and compute the crop from the measured delta. Ensure the final browser-clamped position is handled separately.

Scrolling does nothing

You are probably scrolling the wrong surface. Find the ancestor with overflowing scrollHeight, or use window.scrollTo only when the document owns the overflow.

Sticky headers or chat widgets ruin seams

Hide fixed and sticky overlays for the capture, or crop their repeated pixels consistently. Freeze animations and dismiss consent, newsletter and chat UI before collecting tiles.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Lazy images or virtualized rows are blank

Wait after each scroll and confirm the region’s network and layout activity has settled. Virtualized lists may discard rows that have scrolled away; in that case, export the underlying data or temporarily disable virtualization rather than stitching impossible pixels.

The target moves or becomes stale

Dynamic frameworks can replace the node after scrolling. Re-locate the element before each tile, wait for a stable bounding rectangle, and restart if the content changes during the sequence.

Rank #4
Sale
Samsung 27" Essential S3 (S36GD) Series FHD 1800R Curved Computer Monitor
  • CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
  • SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
  • MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
  • KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
  • INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient

Screenshot raises an element-intercept or stale-element error

Scroll the element into view, wait for visibility, and reacquire it. An overlay, animation or DOM replacement can invalidate a previously stored WebElement reference.

Memory or file-size limits are reached

Write tiles to disk instead of retaining every full-resolution bitmap, downsample only after stitching, and consider JPEG or WebP when lossless PNG text is not required. Very large images may exceed viewer or downstream API limits even when Selenium succeeds.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Performance, fidelity and reproducibility

  • Performance: More, smaller tiles increase driver round trips; larger steps reduce calls but leave less overlap for alignment. Choose the smallest overlap that reliably removes seams.
  • Fidelity: A stitched capture is not a single atomic render. Ads, clocks, carousels, personalized data and animations can change between tiles.
  • Lazy loading: Scrolling can trigger network work, so include explicit waits and verify that images have nonzero dimensions before capturing.
  • Geometry: Browser zoom, device scale factor, transforms and scrollbar width affect the relationship between CSS coordinates and PNG pixels.
  • Auditability: Record URL, browser and driver versions, Selenium binding version, viewport, device scale, selectors, scroll offsets and timestamp with the output.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo provides a website screenshot API and MCP server when you need a rendered URL rather than a hand-built Selenium tiling loop. A single GET returns PNG, JPEG, WebP or PDF. For example, with cURL:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

See the ScreenshotNeo documentation for request options and response headers. Before capture, it can accept cookie or consent banners and remove more than 60 known consent platforms, newsletter popups and chat widgets; each step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and the response identifies the page verdict and billing status with X-Page-Verdict and X-Billed headers. Its MCP server exposes take_screenshot, get_page_info and capture_pdf for Claude, Cursor and other MCP clients.

Other useful options include full-page capture with lazy images loaded, CSS-selector element capture, dark mode, device presets or custom viewports, retina scale, PDF paper and page settings, custom CSS and JavaScript, pre-capture clicks, selector waits, network-idle waits, ad and tracker blocking, custom headers/cookies/user agents and Authorization, timezone and geolocation, transparent backgrounds, resizing, selectable-TTL caching, signed image links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API and an OpenAPI specification. Parameter names used by other screenshot APIs also work.

Best Value
Sale
Sceptre New 22-Inch Gaming Monitor, FHD 1080p, Up to 144Hz, HDMI, DisplayPort, Built-in Speakers, Machine Black (E225W-FW144 Series, 2026)
  • 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
  • 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
  • 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.

The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 screenshots; every feature is on every plan. Sign up free for ScreenshotNeo.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When to use each approach

Requirement Best fit Reason
Must remain inside an existing Selenium test and capture a nested panel Scroll, tile and stitch Uses the current session, cookies and application state.
Need a whole document image with minimal code Tool with documented full-page support Playwright documents fullPage; Selenium’s element endpoint does not.
Need repeatable URL captures without maintaining browser stitching ScreenshotNeo One request, cleanup controls, verdict-aware billing and an MCP server.

FAQ

Can I set an element’s height with JavaScript and call screenshot once?

Changing CSS can expose more content only if the resulting pixels fit in the viewport and the layout remains faithful. It is not a reliable substitute for tiled capture and can alter responsive behavior.

Does maximizing the browser guarantee a full element image?

No. It increases the visible area but cannot guarantee that an arbitrarily tall element fits.

Should I use PNG or JPEG for stitched output?

PNG preserves text and sharp UI edges. JPEG can be smaller for photographic content but may introduce compression artifacts at seams.

Frequently Asked Questions

Can I set an element’s height with JavaScript and call screenshot once?

Changing CSS can expose more content only if the resulting pixels fit in the viewport and the layout remains faithful. It is not a reliable substitute for tiled capture and can alter responsive behavior.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does maximizing the browser guarantee a full element image?

No. It increases the visible area but cannot guarantee that an arbitrarily tall element fits.

Should I use PNG or JPEG for stitched output?

PNG preserves text and sharp UI edges. JPEG can be smaller for photographic content but may introduce compression artifacts at seams.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.