What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
To screenshot an infinite-scroll page in Playwright, first scroll the page or its actual scrollable container until the site has loaded the content you need; then capture it with page.screenshot({ fullPage: true }). A full-page screenshot captures the page’s current scrollable extent—it does not, by itself, trigger more content to load.
Load the content before taking the screenshot
Infinite-scroll pages usually fetch or reveal more items as a visitor scrolls. Playwright’s scrolling guide identifies manual scrolling as a way to force an infinite list to load more elements. The amount of scrolling and the signal that tells you to stop depend on the site.
The following TypeScript pattern checks the number of items in a list, scrolls that list to its bottom, and stops after three consecutive passes with no increase. Replace the selectors and stopping logic with the target page’s actual behavior. The fixed delay is only a fallback; use a reliable loading signal when the site exposes one.
const list = page.getByTestId('results');
let previousCount = 0;
let unchangedPasses = 0;
while (unchangedPasses < 3) {
const count = await list.locator('.item').count();
unchangedPasses = count === previousCount ? unchangedPasses + 1 : 0;
previousCount = count;
await list.evaluate(element => {
element.scrollTop = element.scrollHeight;
});
await page.waitForTimeout(500); // Prefer a site-specific load signal when available.
}
await page.screenshot({ path: 'full.png', fullPage: true });
This is an illustrative pattern, not a universal end-of-list detector or a tested recipe for every site. If the page keeps loading items, use a known target count or a terminal marker instead of relying on a stable count. If loading is asynchronous, wait for the site’s observed request, spinner, or other dependable completion signal before checking the count again.
Free tools Windows power users keep installed
One-click scans. No signup required.
#1 Best Overall
Find the element that actually scrolls
First determine whether the document or an inner results panel owns the scroll. Scrolling the window will not move a list inside a nested container. Use a locator for the real container, preferably one based on user-facing semantics or an explicit testing contract. Playwright locators re-resolve the matching element when used, which is useful when a page’s DOM changes as new items appear.
Scroll the nested container programmatically
const results = page.getByTestId('results');
await results.evaluate(element => {
element.scrollTop += 800;
});
To move directly to its current bottom in a loading loop, set scrollTop to scrollHeight, as in the earlier example.
Use wheel input when the page responds to user scrolling
const results = page.getByTestId('results');
await results.hover();
await page.mouse.wheel(0, 800);
Hovering the nested container first helps direct wheel input to it. A scroll amount such as 800 pixels is an example, not a site-independent requirement.
Rank #2
Bring a page element into view
await page.getByText('Footer text').scrollIntoViewIfNeeded();
When a suitable bottom item or footer exists, bringing it into view can trigger another load. Repeat with the site’s own completion condition until the required content has appeared.
Recommended Free Tools
Choose a stopping condition for the target site
There is no universal signal that an infinite list is finished. Select a condition that matches what the page exposes:
- Known item count: stop when the list reaches the count you need.
- Terminal marker: stop when an end-of-results element becomes visible or attached.
- Loading indicator: wait for loading to finish, then check whether more items appeared.
- Stable item count: stop only after repeated scroll-and-check passes add nothing, and set a sensible cap so a page that continually changes cannot keep the script running indefinitely.
Prefer an observed page signal over a fixed sleep when the site provides one. A delay alone may be too short for a slow response or unnecessarily long for a fast one.
Rank #3
Capture one tall image or screenshots by viewport
One image of the loaded page
After the desired content is present, use fullPage: true to request a screenshot of the page’s full scrollable extent:
await page.screenshot({ path: 'full.png', fullPage: true });
This captures what is currently loaded; it does not scroll an infinite list to make the site fetch more items.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Separate captures for a long or nested list
For a nested scroll container, a locator screenshot captures the matched element, but a scrollable element screenshot shows only the content currently scrolled into view. If one very tall image is unwieldy or you want to inspect sections separately, scroll through the content and save viewport captures at chosen positions. That is an implementation choice; Playwright does not require one capture shape for infinite lists.
Improve repeatability for visual comparisons
Screenshot rendering can vary with the host operating system, browser version, settings, hardware, power source, and headless mode. Keep those conditions consistent when comparing visual baselines. If animation or other dynamic elements cause incidental differences, Playwright’s screenshot API provides animation controls, and its visual-comparison guidance describes using a stylesheet to hide or alter dynamic elements.
Troubleshoot common failures
- The screenshot contains only the first batch:
fullPagecaptures the current page extent; it does not trigger infinite loading. Scroll first, wait for content, and verify the item count or terminal signal before capturing. - The item count never changes: confirm that the selector matches the actual list items and that the correct container is being scrolled. Check whether the page needs wheel input, a particular element brought into view, or more time for its load signal.
- The document moves but the list does not: the list likely has its own scroll container. Target that locator with
evaluateor hover it before usingpage.mouse.wheel(). - The loop never stops: a changing count may not mean new items are arriving, or the site may keep appending content. Use a target count or end marker when available, and bound the number of scroll attempts.
- The image differs between runs: align the browser and execution environment, then control animations or dynamic page elements if they are irrelevant to the comparison.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server. For a one-call capture, request the page after it has loaded the content you need:
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 documentation for API options. Its capture 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 step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for AI agents. The Free plan includes 1,000 shots a month with no card; paid plans start at $5 for 3,000 shots.
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 →Clear out junk files and repair common Windows errorsFree Scan →Sign up for ScreenshotNeo’s free plan to get 1,000 screenshots a month with no card.
Frequently Asked Questions
Does fullPage: true load every item in an infinite list?
No. It captures the page’s current scrollable extent. Scroll and wait for the site to load the content first.
What should I do if the list is inside a scrollable panel?
Target the panel locator, rather than the window, and scroll it with locator.evaluate() or hover it before using page.mouse.wheel().
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.
Do these 3 things before closing this tab:
1Repair Windows errors before they cause bigger problems2Scan for outdated or missing drivers - takes under a minute3Clear out junk files and repair common Windows errors

