To capture lazy-loaded images reliably, scroll through the page in overlapping increments to trigger loading, wait for the images you need to finish successfully, and then take the screenshot. A full-page screenshot or a “network idle” wait alone does not guarantee that offscreen images were requested or loaded.
Why images are missing from full-page screenshots
Lazy loading defers image requests until an image approaches or enters the viewport. Browsers can do this for native loading="lazy" images; sites can also use JavaScript, often with viewport observation, to trigger image loading. A screenshot that captures the whole document does not necessarily scroll through it first, so parts of the page may never trigger their image requests. See Chrome’s explanation of browser-level image lazy loading and MDN’s overview of lazy-loading techniques.
As an Amazon Associate I earn from qualifying purchases.
Network quiet is not proof of image readiness: a deferred image may not have been requested yet, and a completed request does not by itself establish that every image in the final capture loaded successfully. Scroll to trigger loading, then check the images that matter.
Playwright: scroll, verify images, and capture
This JavaScript example uses Playwright. It scrolls in increments smaller than the viewport, waits for ordinary <img> elements to complete successfully, reports images that did not pass the check, and saves a full-page screenshot.
#1 Best Overall
- Camera mount tripod stand with zippered storage bag
- Adjustable height from 16.1inch to 50inch with 3-section,lever-lock legs for simple adjustments
- Folds down quickly and made of lightweight aluminum; It weighs only 1.23 lbs,lightweight and portable, easy to carry for travel,hiking,camping,etc
- 3-way head allows for tilt and swivel motion;portrait or landscape options;Built in Bubble Level,fast and accurate positioning
- Quick-release plate helps ensure fast transitions between shots
const { chromium } = require('playwright');
(async () => {
const url = 'https://example.com';
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage({ viewport: { width: 1365, height: 900 } });
try {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
// Scroll in overlapping steps so viewport-triggered loaders can run.
await page.evaluate(async () => {
const step = Math.max(200, Math.floor(window.innerHeight * 0.8));
let previousHeight = 0;
let stablePasses = 0;
const deadline = Date.now() + 20000;
while (Date.now() < deadline && stablePasses < 3) {
const height = document.documentElement.scrollHeight;
for (let y = 0; y < height && Date.now() < deadline; y += step) {
window.scrollTo(0, y);
await new Promise(resolve => setTimeout(resolve, 100));
}
await new Promise(resolve => setTimeout(resolve, 250));
const newHeight = document.documentElement.scrollHeight;
stablePasses = newHeight === previousHeight ? stablePasses + 1 : 0;
previousHeight = newHeight;
}
window.scrollTo(0, 0);
});
// Bound the wait; do not hang forever on broken or intentionally empty images.
await page.waitForFunction(
() => [...document.images].every(img => img.complete),
{ timeout: 15000 }
).catch(() => {});
const imageStatus = await page.evaluate(() =>
[...document.images].map(img => ({
src: img.currentSrc || img.src,
loaded: img.complete && img.naturalWidth > 0
}))
);
const failed = imageStatus.filter(img => !img.loaded);
if (failed.length) {
console.warn('Images not confirmed loaded:', failed);
}
await page.screenshot({ path: 'page.png', fullPage: true });
} finally {
await browser.close();
}
})();
Install Playwright with npm install playwright; depending on the setup, install its browser with npx playwright install chromium. Replace the example URL and adjust the viewport, time limits, and output path for your capture.
What the checks mean
- The scroll pass is a trigger, not a guarantee that all content or images are ready. Its overlapping steps give viewport-based loaders a chance to observe each region.
img.completebecomes true when loading has completed, including when an image failed. Pair it withimg.naturalWidth > 0to identify ordinary image elements that loaded with usable intrinsic dimensions.- The example waits for completion with a timeout, then checks success separately. That avoids an unbounded wait and leaves a list of images to investigate.
- The height re-checks help with pages that grow during scrolling, but they cannot guarantee that every infinite-scroll feed has been exhausted. Use a site-specific stopping condition, pagination logic, or maximum scroll count when the page keeps adding content.
Playwright supports full-page screenshots, but its documented actionability waits concern actions on particular elements; they are not a page-wide guarantee that lazy images loaded. See the Playwright Page API and Playwright auto-waiting documentation.
Rank #2
- 75in Extendable Camera Tripod: This tripod for camera phone can extend to a height of 75 inches by adjusting the flip locks, which can be quickly adjusted to any desired height to meet the needs of various shooting scenarios. Both the ball head and center column are equipped with level for easy real-time level calibration, ensuring perfectly level shots.Good Digital Camera Accessory Kits for you.
- 3-in-1 Detachable Center Column: The center column supports quick detachment, allowing for flexible use as a monopod or selfie stick (Max Height:43.9 in / 111.5 cm). Camera phone tripod stand can also be installed upside down for low-angle macro shooting. This 3-in-1 multi-functional design simplifies shooting equipment, saves carrying space, and enhances practicality and cost-effectiveness, making it suitable for travelers, outdoor enthusiasts, and content creators.
- 3-Level Angle Adjustment For Various Terrains: The camera tripod legs can be adjusted to three angles using the angle adjustment locks, allowing it to spread almost horizontally to achieve a minimum height of 15.35in(39cm) for low-angle shooting. Each leg adjusts independently in both angle and length, ensuring the tripod stand steadily on stairs, rocky trails, or uneven ground—making it ideal for outdoor-photographers and hikers shooting in unpredictable environments.
- Remote Control & Flexible Ball Head: Equipped with a 360° ball head, which supports free rotation in both horizontal and vertical directions. When shooting vlogs or live streams, you can flexibly switch angles and landscape/portrait modes without moving the tripod. In addition, this phone tripod has a built-in remote control with a maximum 10m control distance. Whether it's selfies, group photos, or long-distance shooting, one-button control makes shooting easier and more convenient.
- Sturdy & Stability: Constructed from aluminum alloy, this DSLR camera tripod features thickened tubes and anti-slip rubber feet that provide stronger grip on various surfaces, effectively preventing image shake. Its bottom hook allows for hanging weights, increasing counterweight and further enhancing overall stability, ensuring smooth footage even outdoors.[Max load 8kg/17.64lb (vertical) or 3kg/6.61lb(45° tilt)]
Adapt the method to Puppeteer
The same strategy applies in Puppeteer: navigate, scroll through the content, wait for image completion, inspect failures, then capture. Puppeteer’s screenshot guide shows navigation with waitUntil: 'networkidle2', but network idle alone does not establish that deferred images were triggered. Its element screenshot behavior can scroll a hidden element into view; that is useful for a target element, not a substitute for a page-wide image check.
Free tools Windows power users keep installed
One-click scans. No signup required.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.setViewport({ width: 1365, height: 900 });
try {
await page.goto('https://example.com', {
waitUntil: 'domcontentloaded',
timeout: 30000
});
await page.evaluate(async () => {
const step = Math.max(200, Math.floor(window.innerHeight * 0.8));
const deadline = Date.now() + 20000;
let previousHeight = 0;
let stablePasses = 0;
while (Date.now() < deadline && stablePasses < 3) {
const height = document.documentElement.scrollHeight;
for (let y = 0; y < height && Date.now() < deadline; y += step) {
window.scrollTo(0, y);
await new Promise(resolve => setTimeout(resolve, 100));
}
await new Promise(resolve => setTimeout(resolve, 250));
const newHeight = document.documentElement.scrollHeight;
stablePasses = newHeight === previousHeight ? stablePasses + 1 : 0;
previousHeight = newHeight;
}
window.scrollTo(0, 0);
});
await page.waitForFunction(
() => [...document.images].every(img => img.complete),
{ timeout: 15000 }
).catch(() => {});
const failed = await page.evaluate(() =>
[...document.images]
.filter(img => !(img.complete && img.naturalWidth > 0))
.map(img => img.currentSrc || img.src)
);
if (failed.length) console.warn('Images not confirmed loaded:', failed);
await page.screenshot({ path: 'page.png', fullPage: true });
} finally {
await browser.close();
}
})();
For Puppeteer’s documented screenshot and interaction behavior, see Screenshots and Page interactions.
Rank #3
- 【Lightweight and Portable】4 section leg can adjust tripod height from 20.4''/52cm to 64.1''/163cm; it can be folded to 15.5''/39.5cm to make it easy to put it in the carrying bag; the net weight with the ball head included is only 2.53lbs/1.15 KG.
- 【360 Degree Ball Head】36mm ball head can be rotated to any angle you want, helping to improve the range of camera activity during panning. It can withstand up to 17.6lbs/8kg.The 360-degree panning dial lets you set up precision shots to capture the beauty of landscapes.
- 【Efficient and Flexible】With powerful and quick flip leg lock, only use one hand can open and close all the buttons in a few seconds. It's very easy to use, saving you more time and can more focused on enjoying the shooting.
- 【Versatile Ability】The center column inverted installation (also with a short center column) to achieve the lowest angling shooting, archery and special photography.
- 【More Compatibility】This camera tripod with standard 1/4'' thread,which can be applied to most Arca-Swiss quick release plates; 1/4" screw is suitable for most cameras, DSLR camera, projector and telescope, etc.
Make the readiness condition fit the page
Exclude intentional placeholders
Some sites deliberately use empty image elements, transparent placeholders, or images that are not part of the desired result. A strict check over every document.images entry can report these as failures. Narrow the check to the relevant selector, for example document.querySelectorAll('.article-content img'), or exclude known placeholder elements.
Handle custom image rendering
Images painted as CSS backgrounds, canvas content, or framework-specific components may not appear in document.images. Wait on the site’s own ready state where available, or inspect the final rendered output. The complete/naturalWidth test only covers ordinary image elements.
Rank #4
- 【74 Inch Tall Tripod and Compact Tripod】 This tall camera tripod has a height adjustment range of 19-74 inches. It can meet the needs of daily work. This compact tripod comes with a carrying bag for outdoor and indoor shooting. This compact tripod weighs 3.14 lbs / 1.4 kg and is easy to store and stow
- 【Tripod for All Camera and Phone】Standard 1/4" screw mount compatible with all cameras ( Canon, Nikon, Fujifilm, Olympus, Panasonic), DSLR, SLR, and digital cinema cameras, also spotting scopes, projector, compact camcorders, binoculars. The 360° phone mount is compatible with iPhone 17 16 15 14 13 12 11 Pro/XS/XR/MAX/8/8 Plus/X/7 Plus/7/6s Plus/6s/6 Plus/6/Samsung Galaxy S22/ S21 Series/ Galaxy Z Flip/ NOTE/ One Plus 1+Series
- 【Professional 3-Way Pan Head】VICTIV Professional camera tripod stand is equipped with a stable and smooth 3-way pan head, it allows 360° horizontal panoramic shots, 180° up and down shots, and 90° vertical portraits. Non-slip pads provide great grip. You can also hang a backpack on the weight hook for extra stability
- 【Video Tripod for Photography】The video camera tripod is suitable for outdoor and indoor shooting. It can meet the daily shooting needs of video producers, video bloggers, and youtube users. Camera tripods for Photography, food shooting, live streaming, scenery shooting, and portrait shooting, etc
- 【Complete Tripod Units】What You Get: 1X Tripod for cell phone and camera, 1X Universal Phone Holder, 1X Extra Quick Release Plate,1X 3-way Pan Head, 1X Handle, 3X Non-slip pads. Please contact us anytime if any questions
Tune waits for the actual page
The example’s pauses and timeouts are starting points, not universal timings. Heavy pages, slow connections, animations, and scripts that insert content later may need different limits or a page-specific readiness signal. Native lazy-loading thresholds can vary with factors such as resource and effective connection type; a fixed delay is therefore less reliable than verifying the result. Chrome guidance also advises against lazy-loading images highly likely to be in the initial viewport, especially the LCP image: web.dev’s browser-level image lazy-loading guidance.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Repair Windows errors before they cause bigger problems3Scan for outdated or missing drivers - takes under a minuteTroubleshooting missing images
- Only images below the fold are missing: the capture likely happened before those regions entered the viewport. Add the overlapping scroll pass before the readiness check.
- The script waits too long or times out: some images may be broken, blocked, or intentionally empty. Use a bounded wait, log the failed image URLs, and exclude only known non-content placeholders.
- Images still appear blank despite passing the check: verify that the right image elements are being inspected. The visible content may be a background image, canvas drawing, or custom component with a separate readiness lifecycle.
- The bottom of a feed is absent: content may load only after scrolling and extend the document. Re-check document height, repeat the scroll pass, and use an application-specific end condition for endless feeds.
- The page looks different after capture: animations or delayed layout changes can shift content after the scroll pass. Wait on a stable, page-specific state before capturing rather than relying only on a generic delay.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server. Its full-page capture loads lazy images. One GET request returns a screenshot; for capture workflows where you need explicit diagnostics, ScreenshotNeo responses identify page verdict and billing status in response headers.
Best Value
- Adjustable 20″–74″ Height: Easily extend from tabletop to full height for portraits, vlogs, outdoor photography, travel shots, and events — perfect for photographers and content creators of all levels.
- Heavy Duty & Stable: Durable aluminum legs support up to 8.8 lbs, so it can take DSLRs, mirrorless cameras, ring lights, GoPros, and smartphones securely without wobble.
- Multi-Device Compatibility: Includes quick release plate & phone mount — switch effortlessly between camera and phone setups for photos, live streams, podcasts or video calls.
- 360° Pan & Tilt Head: Smooth, fluid head movement lets you capture wide panoramas, dynamic video clips, and precise compositions without stiff dragging.
- Travel Ready & Lightweight: Weighing only 2.8 lbs and folding compactly for storage, this tripod is built for backpacks, road trips, hikes, and everyday use. Includes carry bag for convenience.
With the API, the basic request is:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp
See the ScreenshotNeo API documentation for parameters and response details. Cookie banners, popups, and chat widgets are removed before the shot; bot checks, blank pages, and failed loads are never billed. Its MCP server lets AI agents take screenshots. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots.
Sign up for ScreenshotNeo’s free plan.
Frequently Asked Questions
Does a full-page screenshot automatically load every lazy image?
No. Full-page capture can include offscreen content without first triggering every viewport-based image loader. Scroll through the relevant regions and verify image readiness before capture.
Is network idle enough to know lazy images loaded?
No. Network idle does not prove deferred images were triggered or that each relevant image loaded successfully. Check the images you need explicitly.
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
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.




