ScreenshotNeo

BlogGuides

Best Tools to Capture Full-Page Website Screenshots for Documentation

Compare Firefox, Playwright, Puppeteer, and ScreenshotNeo for full-page documentation screenshots, with runnable examples, setup guidance, and troubleshooting.

By the ScreenshotNeo team4 October 20269 min read

A full-page screenshot captures the rendered page beyond the visible browser viewport, including its scrollable content. For an occasional manual capture, Firefox Developer Tools has a built-in full-page option. For repeatable documentation, use Playwright or Puppeteer in a script. If you want an API call instead of maintaining browser setup, ScreenshotNeo is the first service to consider: it removes common consent banners, popups, and chat widgets before capture, bills only clean shots, and its paid plans start at $5 for 3,000 screenshots.

The right choice depends on how often you capture pages, whether you need automation, and whether you need an image of the whole page or one element. A screenshot records the page’s rendered appearance at capture time; it does not preserve the source, interactions, or future state of the site.

1. Choose a capture workflow

Tool Best fit Documented controls Tradeoff
ScreenshotNeo API-based captures without managing a browser script PNG, JPEG, WebP, or PDF; full page, element capture, viewport and device settings, waits, cookies, headers, and more Requires an API key and network request; tune options for the target page.
Firefox Developer Tools One-off manual capture Full-page and element capture; console options include delay, device-pixel ratio, filename, clipboard, and selector Enable the full-page screenshot toolbar control in settings, or use the console command.
Playwright Scripted documentation or test workflow Full-page or element screenshots, image bytes, format and scale controls, masks, and injected stylesheet Requires a scripting setup and maintenance.
Puppeteer Scripted capture in a project using its browser automation stack Full-page capture, clipping, output path, format, and quality Requires a scripting setup and maintenance.

Playwright’s documentation describes a full-page capture as the entire scrollable page, as if viewed on a very tall screen. The reviewed Playwright API examples cover Chromium, Firefox, and WebKit, but this does not guarantee identical behavior for every browser version or configuration. Try the actual target page, particularly if it has lazy-loaded images, sticky elements, dynamic content, or authenticated content.

2. Capture a page manually with Firefox

For a one-time screenshot, Firefox Developer Tools avoids adding code to a project:

  1. Open the page and the Firefox Developer Tools.
  2. Enable Take a screenshot of the entire page in the available toolbox buttons.
  3. Use the screenshot control to capture the full page. Firefox documentation says the toolbar capture is saved to Downloads.

You can also use the Web Console. The basic command is:

:screenshot --fullpage

Firefox documents additional console options for delay, device-pixel ratio, filename, clipboard, and selecting an element. For example, to wait briefly for a menu or hover state before capture:

:screenshot --fullpage --delay 2

Consult Mozilla’s Firefox Web Console command-line documentation for the exact syntax supported by your Firefox version. A delay can help with a known animation or state transition; it does not guarantee that every asynchronous resource has finished loading.

3. Automate full-page screenshots with Playwright

Playwright is a good fit when captures belong in a documentation build, a repeatable script, or an existing test workflow. Its page API supports full-page and element screenshots, and the screenshot guide documents returning image bytes as well.

Install Playwright and its Chromium browser in a Node.js project:

npm install playwright
npx playwright install chromium

Save this as screenshot.mjs and run it with node screenshot.mjs:

import { chromium } from 'playwright';

const url = process.argv[2] ?? 'https://example.com';
const browser = await chromium.launch();

try {
  const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
  await page.goto(url, { waitUntil: 'networkidle', timeout: 60_000 });
  await page.screenshot({ path: 'page.png', fullPage: true });
} finally {
  await browser.close();
}

Usage:

node screenshot.mjs https://example.com

networkidle can be unsuitable for sites that keep network requests open. If navigation times out or the page has ongoing requests, choose a less restrictive navigation condition and wait for a page-specific selector or a deliberate delay. The script above is an example, not a guarantee that all page content is ready when the screenshot is taken.

Capture one element instead of the whole page

When documentation needs a chart, card, or code example rather than the whole document, locate the element and capture it:

const chart = page.locator('#chart');
await chart.screenshot({ path: 'chart.png' });

Use a selector that identifies the intended element. If the selector matches nothing, wait for it or handle the missing element as an error; an element capture cannot include content outside that element.

Mask or restyle selected content

Playwright’s screenshot API supports masks and a stylesheet option. These can make captures more repeatable or obscure selected content in an image. A screenshot mask is a presentation control, not a security guarantee: do not treat it as permission to expose sensitive page data or as a substitute for removing that data from the source.

await page.screenshot({
  path: 'page.png',
  fullPage: true,
  mask: [page.locator('.personal-data')],
  style: '.debug-panel { display: none !important; }'
});

Check the current Playwright screenshot guide and Page screenshot API for option details and supported syntax.

4. Automate full-page screenshots with Puppeteer

Puppeteer offers Page.screenshot() with a fullPage option. It also documents output path, format, quality, and clipping controls. Use it when Puppeteer fits the automation stack already used by your project.

Install it:

npm install puppeteer

Save this as screenshot-puppeteer.mjs and run it with node screenshot-puppeteer.mjs https://example.com:

import puppeteer from 'puppeteer';

const url = process.argv[2] ?? 'https://example.com';
const browser = await puppeteer.launch();

try {
  const page = await browser.newPage();
  await page.setViewport({ width: 1440, height: 900 });
  await page.goto(url, { waitUntil: 'networkidle0', timeout: 60_000 });
  await page.screenshot({ path: 'page.png', fullPage: true });
} finally {
  await browser.close();
}

As with Playwright, a quiet-network condition may not fit every application. A long-running connection can prevent it from completing; use an appropriate navigation condition and wait for the content your documentation requires. See Puppeteer’s official screenshot guide for the current API and option behavior.

5. Or skip the browser setup

ScreenshotNeo provides a website screenshot API. A single GET request can return a full-page PNG, JPEG, WebP, or PDF. See the ScreenshotNeo documentation for the API options and response behavior.

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

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
await Bun.write('shot.webp', res);

Replace YOUR_API_KEY with your key and change the URL to the page you need. The API accepts options for full-page capture, element selection, viewport and device presets, retina scale, waits, custom CSS and JavaScript, cookies, headers, user agent, caching, and output format. Cookie banners, popups, and chat widgets are removed before the shot, and each cleanup step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed; response headers report the page verdict and billing status. Its MCP server lets AI agents use take_screenshot, get_page_info, and capture_pdf. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for 1,000 free screenshots a month, with no card required.

6. Make documentation captures consistent

  • Choose the capture boundary. Use a full-page image for the whole scrollable document; use an element capture when only one component belongs in the docs.
  • Fix the viewport. Set a repeatable width and height so responsive layout changes do not produce unexpected results.
  • Wait for the content you need. Prefer a known selector or application-ready signal. A fixed delay is simple but can be too short on a slow load and wasteful on a fast one.
  • Control the state. Provide the right cookies or authentication where required. Avoid capturing private data into an image that will be committed or shared.
  • Account for lazy loading. Content may appear only after scrolling or interaction. Check that lower-page images and sections are present in the result; use the tool’s supported full-page behavior and, if needed, a deliberate page-specific scroll or wait.
  • Review sticky and fixed elements. A sticky header, floating button, or chat panel may overlap content in a tall capture. Hide or restyle only the elements that should not appear.
  • Keep the output format appropriate. PNG is useful when crisp text and lossless output matter; JPEG or WebP can reduce image size when supported by your destination. Match format and quality settings to your documentation pipeline.
  • Version the capture process. Keep scripts and capture settings with the documentation so a later update can reproduce the same viewport and state.

7. Troubleshooting

Symptom Likely cause What to do
The screenshot stops at the viewport The full-page option was omitted, or the manual full-page control is not enabled. Set fullPage: true in Playwright or Puppeteer, or enable Firefox’s full-page screenshot control / use :screenshot --fullpage.
Bottom-of-page images are missing Images load lazily or require scrolling into view. Wait for the page’s image-loading behavior, scroll through the relevant content when appropriate, and inspect the actual output.
Capture waits until timeout The site maintains network activity, making a network-idle condition unsuitable. Use a less restrictive navigation wait and wait for a selector or state that indicates the needed content is ready.
Content is clipped or unexpectedly wide Responsive layout, oversized content, or fixed positioning changes the full-page dimensions. Set the viewport deliberately, inspect the page’s width, and capture an element if the whole page is not required.
A sticky header covers content Fixed or sticky UI remains in the rendered page during capture. Use a capture stylesheet or hide option where available, or adjust the page state before capturing. Review the result for removed context.
Element screenshot fails or is empty The selector does not match, the element is not visible, or it appears after navigation. Wait for the correct selector, verify it matches the intended element, and handle missing elements explicitly.
Screenshot differs between runs Dynamic data, animation, time, geolocation, viewport, or authentication state changed. Fix the inputs you control, wait for a stable state, and disable or restyle animation where appropriate.
Firefox toolbar option is missing The screenshot toolbar control has not been enabled or the interface differs in the installed version. Enable the full-page screenshot button in toolbox settings, or use the Web Console command documented by Mozilla.
Output is too large for the documentation system A tall page and high device-pixel ratio produce a large image. Reduce scale or dimensions if legibility permits, choose a suitable format, or split the page into section captures.

8. Performance, reliability, and cost

Browser automation gives you control over navigation, state, and output but requires you to install and maintain the automation runtime and scripts. Runtime depends on the page, waits, browser startup, and any extra scrolling or state setup; the reviewed documentation does not establish a general speed ranking. Reuse a browser process for batches when your script design permits it, while keeping each page’s state isolated enough to avoid cross-capture contamination.

For reliability, make failures visible: set finite timeouts, check that expected selectors exist, save output only after capture succeeds, and record the target URL and capture settings with generated files. Retry transient navigation failures carefully rather than treating every failure as a successful image. For scheduled or large batches, consider how the workflow handles partial failures and reruns.

Local browser libraries do not have a per-screenshot service price in the cited documentation, but they do carry setup and maintenance costs. ScreenshotNeo’s published plans are Free: 1,000 shots per month; Starter: $5 for 3,000; Growth: $15 for 15,000; Pro: $39 for 60,000; Scale: $99 for 250,000; and Business: $249 for 1,000,000. Yearly billing gives two months free, and every feature is available on every plan. Only clean shots are billed, according to the product facts supplied for this guide.

9. Frequently asked questions

Does a full-page screenshot create an archive of the website?

No. It is an image of the rendered page at capture time. It does not retain the page source, controls, or later states.

Should I use an image or a PDF for documentation?

Use an image when the docs need a visual snapshot. Choose a PDF when the deliverable should be a document; ScreenshotNeo supports PDF output, while the browser examples here produce images.

Can I capture a page behind a login?

Yes, if your workflow supplies an authorized authenticated state, such as the appropriate browser session or cookies. Keep credentials out of committed scripts and generated documentation.

Which tool is best for a repeatable documentation build?

Playwright or Puppeteer is a natural fit when you want the capture in a script and already use that automation stack. Use Firefox for a quick manual image, or an API when you want to avoid setting up a browser runtime.

Sources