Recommended Free Tools
A full-page screenshot captures the document’s scrollable page; it does not automatically expand every scrollable panel or make content that has not rendered appear. First find out what scrolls, then choose the matching capture target and make sure the content exists before the screenshot is taken.
Why a full-page screenshot can still be incomplete
“Full page” describes the capture area, not everything a browser might show after interacting with a site. The missing content usually points to one of three mismatches: the screenshot targets the document while a nested panel owns the scrollbar; the page has not scrolled far enough to trigger rendering or loading; or the page contains a virtualized list that does not keep all its records in the document at once.
These cases need different fixes. A larger screenshot area can help capture content already in the document, but it does not, by itself, scroll the page, trigger application behavior, or turn a virtualized list into a complete dataset.
Check which part of the page actually scrolls
The document owns the scrollbar
If the browser’s main scrollbar moves through the missing content, the content belongs to the page’s document. A full-page option is intended for this case: Puppeteer documents fullPage as capturing the full page, and Playwright offers a full-page option on its Page screenshot API. If the result still ends early, check whether the document grew only after scrolling or whether a fixed-height layout is limiting what is present.
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 →#1 Best Overall
A panel has its own scrollbar
Many applications keep the document at a fixed height and scroll a results pane, chat window, table, or other panel inside it. A document-level full-page screenshot is not expected to expand that nested scrolling region. A Playwright issue response describes this behavior as expected and suggests targeting the container element instead.
Element screenshots have an important limit: they capture the element’s rendered bounds, not necessarily every item hidden behind its own scrollbar. If the panel’s full contents are needed in one image, use the element as the target and, where feasible, adjust the page or test layout so the panel grows and its overflow is visible. That can change the layout, so verify that the expanded panel still represents the content you intend to document. If changing the layout is unsuitable, capture the relevant panel views separately.
How to identify the owner
- Move the pointer over the missing-content area and scroll. Note whether the browser scrollbar or a scrollbar inside that panel moves.
- Inspect the page at the point where the screenshot ends. If the document ends but an inner panel still has a scrollbar, the panel—not the document—is the relevant target.
- Decide what the output must show: the whole long document, the visible bounds of one component, or the full contents of an inner scroll region. Those are different capture jobs.
Make scroll-triggered content render before capture
Pages may load images or iframes lazily, reveal sections with an IntersectionObserver, or start animations when content enters the viewport. A full-page screenshot can extend beyond the viewport without reproducing the sequence of real scroll events that triggers those behaviors. A Playwright feature discussion describes these as possible causes of missing content, but behavior varies by page and implementation.
For a document with scroll-triggered content, scroll through it before taking the screenshot, allow asynchronous work to settle, and inspect whether the images, frames, or sections actually appeared. Do not assume that a single arbitrary delay is enough: some pages load promptly, while others wait on network activity, user interaction, or application-specific conditions.
Free tools Windows power users keep installed
One-click scans. No signup required.
Virtualized lists need extra care. They often render only the rows near the current viewport and replace those rows as the user scrolls. Scrolling through the list can expose later rows, but it does not guarantee that one final full-page image will contain every earlier row. If the complete logical dataset matters, capture the relevant views separately or obtain the data through the application or test interface; a screenshot alone may not preserve records that were removed from the rendered page.
Choose the capture API that matches the target
Whole document: Playwright
With Playwright, page.screenshot({ fullPage: true }) asks for the full document. The following Node.js example first scrolls the document in viewport-sized increments, then captures it. It assumes Playwright and a compatible browser are already installed. Replace the URL with the page you are authorized to capture.
Rank #3
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage({ viewport: { width: 1365, height: 900 } });
try {
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
let previousHeight = 0;
for (let pass = 0; pass < 20; pass++) {
const height = await page.evaluate(() => document.documentElement.scrollHeight);
if (height === previousHeight) break;
previousHeight = height;
await page.evaluate(() => window.scrollBy(0, window.innerHeight));
await page.waitForTimeout(500);
}
await page.evaluate(() => window.scrollTo(0, 0));
await page.screenshot({ path: 'full-page.png', fullPage: true });
} finally {
await browser.close();
}
})();
The loop is a practical trigger for scroll-dependent page behavior, not a guarantee that every asset or request has completed. The pass limit prevents an endlessly growing page from keeping the script running forever; adjust it for the page, and check the output for missing ranges. If the page requires a specific selector or application state before loading content, wait for that condition rather than relying only on the delay.
One component or panel: Playwright locator
For one component, use a locator screenshot instead of a full-document screenshot. This captures the element’s bounds. If it is a nested scroller, those bounds may show only its current visible area. When the page can safely be altered for the capture, a test can expand the panel first; check the result because changing overflow and height may affect layout.
const panel = page.locator('#results');
await panel.evaluate(el => {
el.style.height = `${el.scrollHeight}px`;
el.style.maxHeight = 'none';
el.style.overflow = 'visible';
});
await panel.screenshot({ path: 'results-panel.png' });
Use the actual selector for the panel, and treat this adjustment as a test-specific workaround rather than a universal fix. It cannot restore virtualized rows that are no longer rendered.
Rank #4
Whole document or element: Puppeteer
Puppeteer’s screenshot options include fullPage, captureBeyondViewport, and clipping. These control capture area; they do not themselves make scroll-triggered content render. For the whole document, the core call is:
await page.screenshot({ path: 'full-page.png', fullPage: true });
Puppeteer also documents element screenshots through ElementHandle.screenshot(). Use that for a specific target rather than assuming a page-level capture will expand a nested scroller. The Puppeteer screenshot-options reference cited here identifies version 25.12.0; confirm option behavior against the documentation for the version installed in your project.
What capture-area options can and cannot do
fullPagerequests the full document capture in Puppeteer; Playwright provides a corresponding full-page screenshot option.captureBeyondViewportand clipping affect the capture area in Puppeteer. They do not perform the scroll sequence needed to trigger site code.- An element or locator screenshot targets a component, not the entire document. A component with internal overflow may still need a layout adjustment or multiple captures.
A practical troubleshooting sequence
- Find the scrollbar: determine whether the document or a nested panel moves when you scroll over the missing area.
- Match the target: use a full-page capture for a long document, and an element or locator capture for a component. For a scrollable panel, decide whether its visible bounds are sufficient or whether the test layout must expand it.
- Trigger rendering: if content appears only when approached, scroll through the page in increments and allow its real load or render behavior to complete.
- Check what is present: inspect the output for missing sections, unloaded images or frames, and repeated fixed or sticky elements. A tall image is not proof that every logical list item was rendered.
- Choose a fallback for virtualization: capture separate views or retrieve the data through the application or test interface if completeness matters. Record the trade-off instead of describing one screenshot as the complete dataset.
Or skip the browser setup
For an API-based capture, one GET request can return an image or PDF. ScreenshotNeo supports full-page captures with lazy images loaded, as well as element capture by CSS selector. Its documentation covers the API options and request parameters: ScreenshotNeo API documentation.
Best Value
curl -G "https://api.screenshotneo.com/v1/shot"
-d access_key=YOUR_API_KEY
--data-urlencode url=https://example.com
-o shot.webp
ScreenshotNeo removes cookie and consent banners, newsletter popups, and chat widgets before capture; each of those steps can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and response headers report the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for AI agents using Claude, Cursor, or another MCP client.
The Free plan includes 1,000 screenshots per month without a card. Paid plans start at $5 for 3,000 screenshots; yearly billing gives two months free. Every feature is available on every plan. These facts describe ScreenshotNeo’s stated plans and features, not a guarantee that a particular site will render or expose all of its content in one image.
Sign up for ScreenshotNeo’s free plan to try 1,000 screenshots a month with no card.
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.




