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:
- Prepare the page: open the URL, set the required viewport and state, and wait for the application state you need.
- 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.
#1 Best Overall
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
pathchooses where the file is written.typeselects 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.
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. typeselects the output format; JPEG quality is available for JPEG output and does not apply to PNG.cliprestricts the capture to a rectangle.captureBeyondViewportcontrols capture behavior outside the current viewport for applicable screenshots.omitBackgroundcan 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.
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.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →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.
Rank #4
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.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):
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemscurl -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.
Best Value
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.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →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.
Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minutePC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Quick Recap
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.




