Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run Scan×
Skip to content
browser automation

How to Take Full-Page Screenshots with Puppeteer, Playwright, or Selenium

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

Use the page screenshot API’s full-document option: Playwright and Puppeteer both use fullPage: true. Selenium is driver- and binding-dependent; the reviewed Python Firefox API provides get_full_page_screenshot_as_file(). In every framework, navigate first, wait for the content your test needs, choose an output format, and remember that “full page” captures the web document—not the browser’s address bar or other chrome.

What “full page” means

A viewport screenshot records only the pixels currently visible in the browser window. A full-page screenshot renders the page’s scrollable document as one image, as though the page could fit on a very tall screen. The result can include content far below the fold, but only content that has actually loaded. The option does not automatically make every lazy image, infinite-scroll feed, animation, or client-side request finish.

Full-page capture is therefore a two-part operation:

  1. Prepare the page: open the URL, set the required viewport and state, and wait for the application state you need.
  2. Capture the document with the framework’s full-page API.

Use a browser-context screenshot when you need the page itself. None of these APIs promises the operating system window frame, tab strip, or address bar.

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

Playwright: capture the full scrollable page

JavaScript example

Install Playwright in your project, then launch a browser, navigate, and pass fullPage: true:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });

  await page.goto('https://example.com', { waitUntil: 'networkidle' });
  await page.screenshot({
    path: 'page.png',
    fullPage: true,
    type: 'png'
  });

  await browser.close();
})();

fullPage: true tells Playwright to capture the full scrollable page rather than only the current viewport. The API also supports a path, an explicit image type, clipping, animation handling, caret visibility, locator masks, and background omission. Use the syntax for the language binding installed in your project; the same page-screenshot capability is documented for Python and Java.

Python example

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page(viewport={"width": 1440, "height": 900})
    page.goto("https://example.com", wait_until="networkidle")
    page.screenshot(path="page.png", full_page=True, type="png")
    browser.close()

Useful Playwright controls

  • path chooses where the file is written.
  • type selects PNG, JPEG, or WebP where supported by the binding.
  • Clipping captures a rectangle instead of the whole document.
  • Animation controls help produce stable visual output when elements are moving.
  • Masking can hide sensitive or intentionally variable locator regions.
  • Background options affect whether the page background is included.

Do not treat wait_until: "networkidle" as a universal “the page is complete” signal. Applications that keep connections open, render after network activity, or load content in response to scrolling may need an explicit locator wait, a short application-specific delay, or preparation code.

Puppeteer: use fullPage in ScreenshotOptions

JavaScript example

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setViewport({ width: 1440, height: 900 });

  await page.goto('https://example.com', { waitUntil: 'networkidle2' });
  await page.screenshot({
    path: 'page.png',
    fullPage: true
  });

  await browser.close();
})();

Puppeteer’s ScreenshotOptions.fullPage is a Boolean switch. Its documented default is false, so omitting it produces a viewport capture. Supplying true requests the full page. The current reference surfaced for this article displays Puppeteer 25.12.0; check the reference for the version actually installed in your project before relying on a newly added option.

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

Output and image options

  • With a path, Puppeteer can infer the image type from the extension. Use an explicit type when you want the format to be unambiguous.
  • type selects the output format; JPEG quality is available for JPEG output and does not apply to PNG.
  • clip restricts the capture to a rectangle.
  • captureBeyondViewport controls capture behavior outside the current viewport for applicable screenshots.
  • omitBackground can produce transparency where the browser and output format support it.

Waiting for application state

networkidle2 in the navigation example waits for a low level of network activity, not for a business condition such as “all product cards are visible.” For reliable captures, wait for a selector that proves the required state, then screenshot:

await page.goto('https://example.com/catalog', { waitUntil: 'domcontentloaded' });
await page.waitForSelector('[data-catalog-ready]');
await page.screenshot({ path: 'catalog.png', fullPage: true });

Selenium: verify full-page support for your driver

Selenium does not give every browser and language binding one identical full-page command. Generic screenshot APIs describe the current browsing context or an element, and full-document support depends on the driver. The reviewed Python Firefox driver API documents an explicit method:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument("-headless")
driver = webdriver.Firefox(options=options)
try:
    driver.get("https://example.com")
    driver.get_full_page_screenshot_as_file("page.png")
finally:
    driver.quit()

The same Firefox Python API also documents methods that return full-page screenshot bytes, base64 data, or save the image under another method name. Confirm the exact method and return value in the Selenium version, browser, driver, and binding used by your project. The Python API reference surfaced for this article is version 4.49.0.

Why a generic Selenium call may not be enough

A call such as a driver’s ordinary screenshot method can mean “the current viewport” rather than “the entire document.” Selenium’s Ruby documentation explicitly qualifies full-page support on the driver’s capability. A script that works in Firefox may not be portable to Chromium or another binding without a different implementation. Treat full-page capture as a capability to check, not an assumption.

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

Preparing pages that lazy-load or grow while scrolling

Full-page flags define the capture extent; they do not establish that deferred content has loaded. Before taking the image:

  • Wait for a stable selector that your application sets after rendering.
  • If images load only when near the viewport, scroll through the document or trigger the application’s loading routine, then wait for the image elements to complete.
  • For infinite-scroll pages, define a stopping condition such as a known item count or an end-of-results marker. Otherwise the page may keep changing while the screenshot is assembled.
  • Disable or finish animations when a stable visual is required. Playwright’s screenshot controls can help; in other frameworks, use page CSS or application test hooks.
  • Mask or remove personally identifiable or secret data before writing an artifact.

Do not add an arbitrary delay as the only synchronization mechanism. A selector, application-ready flag, or deterministic item count is usually more repeatable.

Choosing between the frameworks

Need Playwright Puppeteer Selenium
Direct full-page switch fullPage: true fullPage: true Depends on driver and binding; Firefox Python documents an explicit method
Language examples in the reviewed documentation JavaScript, Python, and Java JavaScript API reference Python Firefox API and generic language documentation
Best portability assumption Use the installed Playwright binding and browser Check options for the installed Puppeteer version Verify browser, driver, Selenium version, and binding support
Primary decision factor Your existing Playwright test code and its controls Your existing Puppeteer automation Required browser coverage and driver capabilities

There is no evidence here for a universal performance or reliability winner. Choose the framework already used by your test or automation code, then verify the exact full-page behavior in the target browser and binding.

Troubleshooting full-page captures

The image contains only the viewport

Check that the option is spelled and nested correctly: Playwright and Puppeteer require fullPage: true (or full_page=True in Python Playwright). In Selenium, confirm that you called the driver’s documented full-page method rather than a generic screenshot command.

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

Images or cards are missing below the fold

The page probably lazy-loads content. Scroll or invoke the application’s loading path, wait for the relevant elements, and capture only after the content is present. Full-page mode alone is not a promise to load every deferred resource.

The screenshot is cut off or the page keeps changing

Look for infinite scrolling, a continuously updating feed, sticky elements, or active animations. Establish a finite stopping condition, freeze test data where possible, and disable or wait out motion.

Navigation never reaches the chosen wait state

Long-lived connections can prevent an idle-network condition. Use a less restrictive navigation wait and then wait for a specific application-ready selector. A network-idle setting is a synchronization aid, not a universal completeness guarantee.

Selenium raises an unsupported-command or capability error

That driver may not implement full-page screenshots for the current browser or binding. Check the installed Selenium API and driver documentation, update compatible components together, or use a browser/binding combination with a documented full-page method.

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.

The output format or transparency is wrong

Set the format deliberately rather than relying on a filename extension. Remember that JPEG has no alpha channel, PNG quality settings do not behave like JPEG quality, and transparent backgrounds depend on both the framework option and the chosen format.

The capture is unexpectedly slow or large

A full document can be much taller than the viewport. Reduce unnecessary page content in the test fixture, choose an appropriate image format, avoid capturing more than the required page, and store artifacts outside the critical path when possible. Do not assume that a shorter timeout makes a large capture faster; it can simply create failures.

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. A single GET request returns a PNG, JPEG, WebP, or PDF, and full-page capture can load lazy images before taking the shot. It also supports CSS-selector element capture, device presets and custom viewports, retina scale, dark mode, custom CSS and JavaScript, clicks, selector or network-idle waits, ad/tracker/request blocking, cookies and headers, geolocation and timezone, resizing, caching with your chosen TTL, signed image links, asynchronous jobs, webhooks, bulk capture of up to 100 URLs per call, a usage API, and an OpenAPI specification.

Here is the one-call cURL form (see the ScreenshotNeo documentation for parameters and response details):

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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}`);

ScreenshotNeo accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status in 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.

The Free plan includes 1,000 shots per month with no card. Paid plans start at $5 for 3,000 shots; yearly billing gives two months free, and every feature is available on every plan. Create a free ScreenshotNeo account to try it without a card.

FAQ

Can a full-page screenshot include the browser address bar?

No. These APIs capture the page or browsing context, not the surrounding browser chrome.

Which framework should a new project choose?

Use the framework that matches your language, existing automation, required browsers, and the driver capabilities you can support. The documented APIs do not establish a universal winner.

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

Does full-page mode guarantee every pixel below the fold is current?

No. The page must have loaded and stabilized the content you intend to capture, especially for lazy and infinite-scroll interfaces.

Frequently Asked Questions

Can a full-page screenshot include the browser address bar?

No. These APIs capture the page or browsing context, not the surrounding browser chrome.

Which framework should a new project choose?

Use the framework that matches your language, existing automation, required browsers, and the driver capabilities you can support.

Does full-page mode guarantee every pixel below the fold is current?

No. Load and stabilize lazy or dynamically generated content before capture.

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

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

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

Read next

Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.