Puppeteer’s page.screenshot({ fullPage: true }) captures the page as it is rendered; it does not scroll indefinitely to trigger content loading. Blank, clipped, oddly sized, or incomplete images usually point to a mismatch between the page’s capture geometry, its loading state, and the screenshot options. Start by checking the viewport and application readiness at deviceScaleFactor: 1, then add complexity one change at a time.
What fullPage does—and what it does not do
Puppeteer’s ScreenshotOptions API defines fullPage as taking a screenshot of the full page. It is a capture mode, not an instruction to scroll through the site, wait for every future request, or cause infinite-scroll content to appear. If a page loads more cards only after a visitor scrolls, those cards may not exist in the document when the screenshot starts.
The viewport is a separate input. Puppeteer’s Viewport API expresses width and height in CSS pixels; deviceScaleFactor controls the device-pixel ratio and defaults to 1. A screenshot can therefore be wrong even when the page loaded successfully: CSS may respond to a changed viewport, content may still be rendering, or an asset may not have loaded.
Diagnose the failure in layers: first confirm the page and target element exist, then compare a regular viewport capture with a full-page capture, then investigate width/height behavior, assets, lazy loading, and scale factor. This makes it easier to identify whether the problem is the page, the capture geometry, or the requested output.
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
Establish a predictable baseline
Set the viewport before navigation
Choose and record a viewport before calling page.goto(). For example, use a CSS viewport of 1440 by 900 with deviceScaleFactor: 1. Setting it early gives responsive layout a stable size when the page first renders. If the page is already open, changing viewport later can trigger a reflow and make a comparison misleading.
Wait for the app, not just the network
waitUntil: 'networkidle0' can be a useful navigation condition, but it does not prove that a chart has drawn, a client-rendered component has finished, or a lazy image has loaded. Use an application-specific readiness condition as well, such as a selector that appears only when the report is ready. Check the final URL and required content before capturing.
Use this starting point
This Node.js example includes a real app-ready selector placeholder and checks image/font readiness before taking the screenshot. Replace the URL and selector with ones for your page. The image wait is bounded so a broken image cannot block the capture forever; the final check reports images that did not load rather than silently assuming they are usable.
const puppeteer = require('puppeteer');
(async () => {
const url = 'https://example.com/report';
const readySelector = '[data-report-ready="true"]';
const browser = await puppeteer.launch({ headless: true });
try {
const page = await browser.newPage();
await page.setViewport({
width: 1440,
height: 900,
deviceScaleFactor: 1,
});
await page.goto(url, { waitUntil: 'networkidle0' });
await page.waitForSelector(readySelector, { timeout: 15000 });
const assetCheck = await page.evaluate(async () => {
if (document.fonts?.ready) await document.fonts.ready;
const images = [...document.images];
await Promise.race([
Promise.all(images.map(img =>
img.decode ? img.decode().catch(() => {}) : Promise.resolve()
)),
new Promise(resolve => setTimeout(resolve, 10000)),
]);
return images
.filter(img => !img.complete || img.naturalWidth === 0)
.map(img => img.currentSrc || img.src);
});
if (assetCheck.length) {
console.warn('Images not ready or unavailable:', assetCheck);
}
await page.screenshot({ path: 'full.png', fullPage: true });
} finally {
await browser.close();
}
})();
The 15-second selector wait and 10-second asset wait are example bounds, not universal readiness settings. Tune them for the application and fail or log according to the needs of your pipeline. If your page exposes a stronger “finished rendering” signal, use that instead of inferring readiness from network quiet.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
Fix blank or incomplete screenshots
Confirm the browser captured the intended page
A screenshot may be blank because navigation failed, redirected unexpectedly, rendered an error or bot-check page, or never reached the content route. Log page.url() after navigation and verify the expected title or a required selector. Check the browser console and failed requests when a page is unexpectedly empty. Do not assume a resolved goto() call means the intended application state is ready.
Check for zero-size or missing targets
Before capturing an element, inspect its bounding box and verify that width and height are greater than zero. For a page capture, compare the document’s dimensions with the target content. A selector can exist but still be hidden, collapsed, or not yet populated. Wait for the relevant content and geometry, not just the selector’s presence.
Separate page rendering from screenshot mode
Take a normal viewport screenshot at the same viewport and scale factor. If that image is already blank, investigate navigation, readiness, styles, or the browser environment. If the viewport image is correct but fullPage fails, focus on capture geometry, viewport-relative CSS, page dimensions, and Puppeteer/Chromium compatibility.
Correct clipping, width changes, and viewport-dependent layout
A documented Puppeteer issue described full-page capture changing the width to the content width. That can alter CSS based on vw or vh, because those units respond to viewport geometry. Treat this as a failure mode reported for a particular issue, not proof that every current Puppeteer release changes width in the same way.
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Measure both the configured viewport and the page. In the browser context, inspect document.documentElement.scrollWidth, document.documentElement.scrollHeight, body dimensions, and getBoundingClientRect() for the relevant element. A document wider than the viewport may indicate overflow; a zero-sized target suggests the capture is starting before layout is ready. Record measurements alongside screenshots so that a layout change is visible rather than guessed at.
When the viewport image is stable but full-page output flashes or resizes, test captureBeyondViewport: false. An issue against Puppeteer 8 reported that this option resolved intermittent resizing and flashing in that case. It is a diagnostic option, not a universal fix. The current ScreenshotOptions API documents captureBeyondViewport as defaulting to false when there is no clip and true when a clip is provided.
If the page is still clipped or the layout shifts, try an explicit clip for a bounded region or use ElementHandle.screenshot() for a single component. Keep the configured viewport width and compare the output dimensions before and after the change. For a full document with unusually large dimensions, consider splitting the content into meaningful sections or exporting to PDF instead of relying on one very tall bitmap.
Handle 100vh, sticky headers, and fixed overlays
Full-page capture changes the effective capture area, while CSS may be written for the normal browser viewport. Sections sized with 100vh, width rules using vw, sticky navigation, fixed banners, and overlays can consequently look repeated, cropped, or repositioned in the output. A viewport screenshot that looks correct does not guarantee that a full-page capture will preserve the same visual behavior.
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 →For a controlled export, apply a temporary export class or stylesheet that adjusts the specific components involved. For example, a report might replace a viewport-height hero with a content-driven height and change a sticky header to static positioning. The exact CSS depends on the page; there is no safe universal override that preserves every layout. Remove the export state after capturing, or use a fresh page for the capture so that export-only styling cannot leak into later work.
Where a fixed element is part of the intended design, decide whether it belongs once in the output or should appear at each viewport segment. A full-page bitmap does not automatically resolve that product decision. Validate the result against the intended artifact rather than simply trying to suppress every fixed element.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
Load lazy images and infinite-scroll content deliberately
Full-page mode captures content already present in the document; it is not an infinite-scroll loader. For lazy images, scrolling can trigger loading, while a page that appends records on scroll needs a separate bounded loading pass. Avoid an unbounded loop: some sites continuously add content or never reach a stable network state.
- Define a stopping condition. Choose a maximum number of scrolls, a known last-item marker, or a condition based on stable document height and loaded-item count.
- Scroll in finite increments. Move through the document in steps rather than jumping directly to the bottom, so intermediate lazy content has a chance to enter the loading region.
- Wait after each step for the page’s own signal. Prefer a new-item selector, a changed item count, or an application-ready marker. A short delay may be a fallback, but it is not proof that loading completed.
- Stop when the condition is met. If height and item count stop changing for a defined number of checks, or the last-item marker appears, end the loop and capture. Log when a maximum bound is reached so a truncated result is not mistaken for a complete one.
After the scroll pass, check that required items exist and that image elements have usable dimensions. Broken or blocked assets should be reported distinctly from content that was never loaded. If infinite content has no natural end, define the intended capture range rather than attempting to capture an unbounded page.
Debug deviceScaleFactor and distorted output
Issue reports describe white or incorrect output at scale factor 2 and rendering defects when fullPage and deviceScaleFactor are combined. Those reports identify possible failure modes, not a guarantee that scale factor 2 is broken in current versions. First reproduce the capture with deviceScaleFactor: 1. If it works, raise the factor only after the viewport, app-ready check, and full-page geometry are stable.
A higher scale factor increases output pixel dimensions relative to CSS dimensions and can make a very tall capture more demanding. If only high-scale full-page output fails, record the Puppeteer and Chromium versions, page dimensions, and scale factor; then test whether the issue follows the scale setting or the page’s total dimensions. Do not change scale, viewport, and readiness logic all at once, or the result will not identify the cause.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Choose the right capture output
| Need | Use | Why |
|---|---|---|
| One component or card | ElementHandle.screenshot() |
Limits the capture to the element rather than the entire document. |
| A known bounded region | page.screenshot() with an explicit clip |
Makes the target rectangle explicit and easier to compare. |
| A very tall page with stable geometry | fullPage: true |
Captures the full document without requiring a separate scroll-and-stitch routine. |
| Paginated print output | PDF generation | Uses page layout and pagination rather than a single tall image. |
| Content that appears only after scrolling | A bounded scroll/load routine, then capture | Triggers the site’s own loading behavior before the screenshot. |
For repeatable visual-regression checks, keep viewport, scale factor, browser versions, page state, and readiness conditions consistent. Compare output dimensions as well as pixels: a diff between images with different geometry can obscure the actual layout change. Capture cost and run time also grow with page size, asset loading, and additional scroll passes, so target the smallest artifact that meets the test.
Troubleshooting by symptom
| Symptom | Likely cause | What to try |
|---|---|---|
| Entire screenshot is blank | Wrong route, failed navigation, bot/error state, app not rendered, or zero-size content | Check final URL, required selectors, console/errors, and target bounding boxes; compare a viewport screenshot. |
| Bottom content is missing | Content is lazy-loaded or appended only on scroll | Run a finite scroll loop with a stop condition and verify item count before capture. |
| Width or layout differs from viewport shot | Full-page geometry interacts with vw, vh, overflow, or capture mode |
Measure document dimensions; test captureBeyondViewport: false; try a clip or element capture. |
| Sticky or fixed elements appear in odd places | Viewport-relative positioning behaves differently across the extended capture area | Use an application-specific export style and validate the intended treatment. |
| Images or text are missing | Fonts, images, charts, or client rendering were not ready | Wait for an app-ready condition; await font readiness; inspect image completion and dimensions. |
| Scale 2 is white or distorted, while scale 1 works | Possible scale/capture interaction or large output dimensions | Keep scale 1 as a baseline; then test scale 2 with the same page state and record versions and dimensions. |
When a fix works, keep it as a small reproducible test in the project. Include the Puppeteer and Chromium pair, viewport, scale, page dimensions, URL state, and relevant selector in the test record. This is especially useful when a browser update changes rendering or screenshot behavior.
Recommended Free Tools
Or skip the browser setup
If your goal is to receive a website screenshot rather than control Puppeteer internals, ScreenshotNeo provides a screenshot API and MCP server for developers. A GET request returns PNG, JPEG, WebP, or PDF output. Its capture can accept cookie/consent banners and remove more than 60 known consent platforms, newsletter popups, and chat widgets before the shot; those steps can each be turned off. Bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and responses identify the page verdict and billing status in headers. The MCP server includes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.
One-call cURL example (replace the target URL as needed):
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 API documentation for request options. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Sign up for ScreenshotNeo’s free plan.
Frequently Asked Questions
Does networkidle0 guarantee that every image and chart is ready?
No. It describes network activity at navigation time, not whether application rendering or later lazy loading has finished. Wait for the page’s own ready signal and validate required assets.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Should I always set captureBeyondViewport to false?
No. It is worth testing when full-page capture flickers or resizes, but the reported fix is tied to a particular Puppeteer 8 issue and may not address other failures.
When is PDF a better choice than a full-page screenshot?
Use PDF when the deliverable should be paginated print output; use an element screenshot or clip when you need a bounded image.
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.

