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

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

“Screenshot all pages” can mean two different jobs: capturing one long, scrolling document, or creating images for every URL in a website. Use Firefox’s Save full page for a one-off document. For repeatable or site-wide work, discover URLs, queue them, and use browser automation such as Playwright or Puppeteer. A full-page flag captures one scrollable document; it does not crawl a whole domain for you.

Decide what “all pages” means

Clarify the scope before choosing a tool:

  • One long page: one URL containing content below the fold. A full-page screenshot stitches the document’s scrollable area into one image.
  • Every page on a site: a crawl-and-capture job. You need URL discovery (a sitemap, CMS export, or crawler), a queue, rate limits, retries, authentication, and a deterministic filename for each result.
  • Sections or components: a specific element, such as a product card or article body. Capture the element instead of producing an impractically tall bitmap.

Make a capture specification first: URL list, viewport, browser, color scheme, output format, authentication state, wait condition, and naming convention. Record the URL, timestamp and capture settings alongside each image.

Fastest method for one page: Firefox

  1. Open the page in Firefox and wait until the visible content has finished rendering.
  2. Right-click the page and choose Take Screenshot.
  3. Select Save full page, then save the image.

Mozilla’s support documentation describes this right-click flow and the Save full page option (Mozilla Support). In Developer Tools, the entire-page screenshot control may be hidden. Open DevTools, open Settings, find Available Toolbox Buttons, enable the button for taking a screenshot of the entire page, and then use it from the toolbar (Firefox Source Docs).

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

This is ideal for a single manual capture. It has no batch queue, scripting, or reproducible configuration, and menu labels can vary by Firefox version and interface.

Automate full-page screenshots with Playwright

Playwright defines a full-page screenshot as the complete scrollable page, as if it fitted on a very tall screen (Playwright screenshots documentation). Install it in a project, install the browser binaries, and use a deliberate wait condition.

Minimal Node.js script

import { chromium } from 'playwright';

const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1440, height: 900 }, deviceScaleFactor: 1 });
await page.goto('https://example.com', { waitUntil: 'networkidle' });
await page.screenshot({ path: 'example-full.png', fullPage: true, type: 'png' });
await browser.close();

Replace networkidle with an explicit selector wait when the page has long-lived analytics or streaming requests:

await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.locator('main').waitFor({ state: 'visible', timeout: 30000 });
await page.waitForTimeout(500);

Use fullPage: true for the root document. To capture one component, use a locator screenshot instead:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
await page.locator('article').screenshot({ path: 'article.png' });

Playwright CLI

For a quick command-line capture, Playwright’s CLI supports:

Rank #2
Free Fling File Transfer Software for Windows [PC Download]
  • Intuitive interface of a conventional FTP client
  • Easy and Reliable FTP Site Maintenance.
  • FTP Automation and Synchronization
playwright screenshot --full-page --filename=full-page.png https://example.com

The CLI supports PNG, JPEG and WebP output. The --hires option requests a device-pixel capture. In the API, scale: 'css' produces one pixel per CSS pixel, while scale: 'device' follows device pixels and can create substantially larger files (Playwright CLI documentation).

Capture every URL with a queue

A full-page flag does not discover links. Feed a controlled URL list to a queue, limit concurrency, retry transient failures, and write a safe filename:

import { chromium } from 'playwright';
import fs from 'node:fs/promises';

const urls = (await fs.readFile('urls.txt', 'utf8'))
  .split(/r?n/).map(s => s.trim()).filter(Boolean);
const browser = await chromium.launch();
const context = await browser.newContext({ viewport: { width: 1440, height: 900 } });

for (const [i, url] of urls.entries()) {
  const page = await context.newPage();
  const slug = new URL(url).pathname.replace(/[^a-z0-9]+/gi, '-').replace(/^-|-$/g, '') || 'home';
  try {
    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });
    await page.waitForTimeout(500);
    await page.screenshot({ path: `shots/${String(i + 1).padStart(4, '0')}-${slug}.webp`, fullPage: true, type: 'webp', quality: 85 });
  } finally { await page.close(); }
}
await browser.close();

Create the shots directory first. For production, add a concurrency limit rather than opening every page at once, log response status and errors, and persist completed URLs so an interrupted run can resume.

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

Puppeteer alternative

Puppeteer’s official guide exposes Page.screenshot() for page images and ElementHandle.screenshot() for a specific element; Chrome for Developers describes it as providing visual snapshots of full pages or elements (Puppeteer screenshot guide, Chrome for Developers).

import puppeteer from 'puppeteer';
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 1 });
await page.goto('https://example.com', { waitUntil: 'networkidle2', timeout: 60000 });
await page.screenshot({ path: 'example.png', fullPage: true });
await browser.close();

Choose Playwright when you need its cross-browser project tooling and explicit screenshot options; choose Puppeteer when your JavaScript workflow is centered on Chromium-style automation. Both require a runtime, browser installation and code to discover and schedule many URLs.

Make captures complete and repeatable

Load content below the fold

Lazy images and infinite-scroll sections may not exist until they are scrolled or otherwise triggered. Inspect the resulting image; do not assume fullPage loaded every asset. For lazy content, scroll in increments and wait for images, or use the application’s API/export. Virtualized lists may render only visible rows, so capture controlled segments or export the underlying data instead of claiming one bitmap is complete.

Control layout and state

  • Set a fixed viewport and device scale. CSS-pixel scale is smaller and easier to compare; device-pixel scale is useful for high-DPI output but increases dimensions.
  • Disable or freeze animations so repeated captures do not differ. Hide sticky headers, chat widgets or consent overlays only when that reflects your documented capture policy.
  • Use the correct login/session, cookies, headers, locale, timezone and geolocation for private or region-routed pages. Never place credentials in a public URL or source repository.
  • Handle nested scroll containers separately: content inside an element with its own scrollbar is not necessarily part of the root document screenshot.
  • For very tall pages, split sections or create a PDF/HTML archive. A single bitmap can exceed image-editor, browser or downstream processing limits.

Discover URLs responsibly

Prefer an XML sitemap or CMS export, then normalize URLs (canonical host, trailing slash and query policy), remove duplicates and exclude logout, cart, search and infinite URL patterns. If you crawl links, obey the site’s access rules, use a low request rate, identify your automation where appropriate, and stop on repeated server errors. Keep a manifest containing URL, status, output path, viewport, format, duration and error.

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

Output formats, naming and storage

Choice Use it when Trade-off
PNG Text-heavy UI, lossless review, pixel diffs Larger files
JPEG Photographic pages and compact archives Lossy text and edge artifacts
WebP Modern web delivery and smaller files Some legacy tools need conversion
CSS scale Consistent visual comparisons Less physical resolution
Device scale High-DPI print or detailed inspection Much larger dimensions

Use a filename such as site-path--viewport--YYYYMMDD-HHMM--state.webp. Store a JSON manifest and checksum beside each image so you can identify exactly what changed between runs.

Troubleshooting

The screenshot stops before the bottom

Cause: the page uses a nested scroller, virtualized content, or content that appears only after interaction. Fix: identify the scrolling element, capture it or scroll it deliberately, wait for newly loaded content, and verify the image dimensions.

Images are blank or missing

Cause: lazy loading, blocked cross-origin resources, consent gates or an incomplete wait. Fix: use the correct session, trigger lazy loading, wait for specific image selectors, and inspect network failures. Do not merely increase a fixed delay.

Cookie banners or chat cover the page

Cause: overlays are part of the page state. Fix: accept or dismiss consent in the session, or hide a documented selector before capture. Keep the policy consistent across the batch.

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

Pages time out or return bot checks

Cause: slow dependencies, rate limits or anti-automation controls. Fix: reduce concurrency, add bounded retries with backoff, increase the navigation timeout where justified, and respect the site’s rules. A CAPTCHA is not a signal to bypass access controls.

Files are enormous or fail downstream

Cause: an extremely tall page or device-pixel output. Fix: use CSS scale, WebP/JPEG where appropriate, section captures, or PDF/HTML. Validate pixel dimensions and file size before publishing.

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 hosted website screenshot API and MCP server. It accepts a URL and returns PNG, JPEG, WebP or PDF; full-page capture loads lazy images, and options include CSS-element capture, dark mode, device presets or custom viewports, retina scale, PDF paper settings, custom CSS/JavaScript, clicks, selector or network-idle waits, request blocking, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage data and an OpenAPI specification. Parameter names used by other screenshot APIs also work.

Before capture it accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers report the page verdict and whether it was billed. Its MCP server exposes take_screenshot, get_page_info and capture_pdf for Claude, Cursor and other MCP clients.

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

See the ScreenshotNeo documentation for all parameters. The equivalent Python request is:

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}`);

The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account to start.

FAQ

Does a full-page screenshot capture every URL in a domain?

No. It captures one scrollable document. A site-wide run requires URL discovery and a queue.

Should I use a screenshot or PDF for an archive?

Use screenshots for visual comparison and PDFs or HTML archives when a very tall page must remain searchable and manageable.

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

Why do two captures of the same URL differ?

Dynamic ads, animations, time, locale, authentication and lazy content can change the rendered state. Fix those inputs and record them in your manifest.

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.