Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →To bulk screenshot long pages without blank images below the fold, first navigate to each page, scroll through it in increments to trigger deferred content, verify the images or sections you need have loaded, and only then take a full-page screenshot. A full-page option captures the whole scrollable document; it does not guarantee that lazy-loaded content has been requested or rendered.
Why full-page screenshots can still have missing images
Many pages defer images or other content until the relevant elements approach the visible viewport. A screenshot tool’s full-page setting changes how much of the page is captured, not whether the browser has triggered and completed every deferred request. Treat navigation completion as an initial milestone, not proof that the page is visually ready.
Playwright documents fullPage screenshot capture for the full scrollable page, while its navigation options include load, domcontentloaded, networkidle, and commit. Its documentation cautions against using networkidle as the sole readiness criterion: it indicates no network connections for at least 500 ms, not that all visible content is correct. See the Playwright Page API.
A repeatable workflow for a batch
- Navigate. Pick a navigation event appropriate to the site and use it as the first checkpoint, not the final readiness test.
- Scroll progressively. Move down the page in increments so viewport-triggered images and sections have a chance to load. Pause as needed for the target page. There is no universal scroll distance or delay that works for every site.
- Verify what matters. Check target images or dynamic sections directly. For ordinary
imgelements, a page-specific check can inspectcompleteandnaturalWidth; this does not cover CSS background images, every responsive-image case, or content that requires interaction. - Capture the full page. Use the automation library’s full-page screenshot option only after the readiness checks for that page pass.
- Record each outcome. For each URL, log navigation, readiness checks, screenshot success, and any failure reason. This makes it possible to revisit pages with failed navigation, timeouts, missing images, or output-write errors rather than silently accepting incomplete captures.
Incremental scrolling is a practical trigger strategy, not a guarantee: sites implement deferred content differently, and some content may need a click, a particular scroll position, or a page-specific wait.
#1 Best Overall
Playwright example: capture a list of URLs
This Node.js example scrolls through each page, waits for ordinary image elements to finish loading, records per-page failures, and saves a full-page PNG. Tune the navigation timeout, scroll increment, and image policy for the pages you own or are authorized to capture; none is a universal setting.
const { chromium } = require('playwright');
const fs = require('node:fs/promises');
const urls = [
'https://example.com/page-one',
'https://example.com/page-two',
];
async function main() {
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1365, height: 900 } });
const outcomes = [];
try {
for (let i = 0; i < urls.length; i++) {
const url = urls[i];
const path = `screenshots/page-${i + 1}.png`;
const outcome = { url, path, status: 'failed', reason: null };
try {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
// Scroll by viewport-sized increments to trigger viewport-based loading.
let previousHeight = 0;
for (let pass = 0; pass < 30; pass++) {
const height = await page.evaluate(() => document.documentElement.scrollHeight);
for (let y = 0; y < height; y += Math.max(300, window.innerHeight - 100)) {
await page.evaluate(y => window.scrollTo(0, y), y);
await page.waitForTimeout(250);
}
if (height === previousHeight) break;
previousHeight = height;
}
// Wait for currently present img elements, then report those that did not load.
await page.waitForFunction(() =>
[...document.images].every(img => img.complete),
{ timeout: 15000 }
);
const failedImages = await page.evaluate(() =>
[...document.images]
.filter(img => !img.complete || img.naturalWidth === 0)
.map(img => img.currentSrc || img.src)
);
if (failedImages.length) {
throw new Error(`Images not loaded: ${failedImages.join(', ')}`);
}
await fs.mkdir('screenshots', { recursive: true });
await page.screenshot({ path, fullPage: true, type: 'png' });
outcome.status = 'success';
} catch (error) {
outcome.reason = error.message;
}
outcomes.push(outcome);
}
} finally {
await browser.close();
}
await fs.writeFile('screenshots/results.json', JSON.stringify(outcomes, null, 2));
console.log(outcomes);
}
main().catch(error => {
console.error(error);
process.exitCode = 1;
});
The loop performs another pass if the document height changes, but it is intentionally bounded. Very dynamic pages can keep growing or reveal content only through interactions. Adapt the checks to the actual images or sections your task depends on, and treat an unresolved readiness check as a page failure rather than quietly capturing it.
Rank #2
- Intuitive interface of a conventional FTP client
- Easy and Reliable FTP Site Maintenance.
- FTP Automation and Synchronization
Choosing between Playwright and Puppeteer
Both libraries document browser screenshot capabilities. Playwright’s Page API documents full-page capture and browser examples for Chromium, Firefox, and WebKit. Puppeteer’s guide documents page and element screenshots, and its interaction guide describes locator scrolling using mouse-wheel events. Choose based on the runtime, browser requirements, and interactions your existing project needs; the available documentation does not establish a universal speed or reliability winner.
Puppeteer’s screenshot guide and page interactions guide are useful references. Its network-idle API describes waiting for network idleness, which is still a network condition rather than a visual completeness test.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC 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 & 11Rank #3
Troubleshooting incomplete or failed captures
- Images below the fold are blank: confirm the page was scrolled through in increments before capture, then inspect the relevant image elements. A full-page screenshot alone does not trigger every site’s lazy-loading behavior.
- The script exits after navigation but the page is still incomplete: use navigation completion as an initial checkpoint and add page-specific assertions for the content that must appear.
- Network idle occurs but images are absent: do not treat network idleness as visual readiness. Check the image or section directly, and allow for content that loads after interaction.
- An image check times out or reports zero width: record the URL and image source, then distinguish a failed request from a responsive source or content type your check does not cover. CSS background images are not included in
document.images. - The page keeps getting taller: the sample has a bounded scroll loop to avoid running indefinitely. Increase or replace that logic only after deciding how the site signals that more content is available.
- A screenshot file is missing: separate screenshot-write errors from navigation and readiness failures in the batch log; confirm the output directory exists and that the process can write there.
Performance, reliability, and cost considerations
Bulk jobs multiply the time spent navigating, triggering deferred content, checking readiness, and writing files. The appropriate waits depend on each page; the reviewed API documentation does not prescribe a universal delay, timeout, throughput, or batch configuration. Keep a per-URL result record and make retries target only pages whose navigation, content checks, or output failed. Do not count a screenshot as successful merely because the automation call returned if the images that matter were never verified.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
ScreenshotNeo offers a one-request screenshot API and an MCP server for AI agents. Its clean-shot flow accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each cleanup step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses indicate the page verdict and billing status in headers. See the ScreenshotNeo website and API documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
It also has an MCP server with take_screenshot, get_page_info, and capture_pdf tools 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. See the docs for request options and setup.
Rank #4
Sign up for 1,000 free screenshots a month with no card.
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 →Quick Recap
Best Value
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.

