The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →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
- Open the page in Firefox and wait until the visible content has finished rendering.
- Right-click the page and choose Take Screenshot.
- 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).
Recommended Free Tools
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.
#1 Best Overall
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:
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errorsawait page.locator('article').screenshot({ path: 'article.png' });
Playwright CLI
For a quick command-line capture, Playwright’s CLI supports:
Rank #2
- 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.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →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).
Rank #3
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.
PC 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 & 11Crashes, 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 minuteOutput 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.
Rank #4
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.
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.
Best Value
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.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.
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.
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.
Quick 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.

