Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

If a Puppeteer screenshot cuts off text at the bottom of each section, first check what is being captured and which element actually scrolls. A page-level fullPage: true capture covers the document, but it does not automatically expand independently scrolling sections whose content is clipped by CSS. Inspect the screenshot options, nested scroll containers, and layout before changing styles or viewport size; the right fix depends on whether you want the visible viewport, the full document, or the contents of a particular section.

1. Confirm the screenshot scope and Puppeteer version

Start with the exact screenshot call. Puppeteer distinguishes a full-page capture from a clipped region and from capture beyond the viewport. In the current ScreenshotOptions API, fullPage: true requests a screenshot of the full page. clip defines a specific capture region. captureBeyondViewport controls capture beyond the viewport; its documented default is false when there is no clip and true when a clip is present.

The API page currently displays Puppeteer 25.12.0. Check your project’s installed Puppeteer version and its corresponding browser before applying current API guidance to an older setup; behavior can differ across versions.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const screenshotOptions = {
  fullPage: true,
  // Do not set clip unless you intend to capture a specific region.
};

await page.screenshot({ path: 'page.png', ...screenshotOptions });

If you intended only the visible viewport, omit fullPage. If you supplied clip, verify its coordinates and dimensions. Avoid adding options just to make the image taller until you know which content area is missing.

#1 Best Overall
Philips 24 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 241V8LB
  • CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
  • WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
  • A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents

2. Find the element that owns the scrollbar

A full-page capture concerns the main document; it does not turn every nested scrolling section into a full-height page. A section may have its own fixed or maximum height and overflow: auto or overflow: scroll. In that case, the browser’s document can end while the section still has content below its visible area. A Puppeteer issue discussing an inner scrolling region illustrates why a page-level full-page capture may show only the filled viewport of that region: Puppeteer issue #3053.

Inspect the section and its ancestors

In DevTools, inspect the affected section and each ancestor for height, max-height, overflow: hidden, overflow: auto, and overflow: scroll. Then compare the section’s scrollable height with its visible height. For example, evaluate the element directly in Puppeteer:

const dimensions = await page.$eval('.section', element => {
  const style = getComputedStyle(element);
  return {
    clientHeight: element.clientHeight,
    scrollHeight: element.scrollHeight,
    overflowY: style.overflowY,
    height: style.height,
    maxHeight: style.maxHeight,
  };
});
console.log(dimensions);

If scrollHeight is greater than clientHeight, the element has content beyond its visible box. That is evidence of a nested scroll area, not proof that the CSS is wrong: the intended result may be to capture only what a visitor can currently see. If you need all of that section’s contents, decide whether to change the page’s CSS for the capture or capture the section’s scrollable content in a deliberate way.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Philips 22 Inch Computer Monitor FHD 100Hz VA VESA Flicker-Free, 221V8LB
  • CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
  • 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
  • SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
  • INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
  • THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors

Change overflow only when full content is the goal

For a capture-specific rendering, a temporary style can remove a section’s height constraint and allow its content to flow. Apply it only to the relevant section and test that it does not break layout or hide intended behavior. For example:

await page.addStyleTag({
  content: '.section { height: auto !important; max-height: none !important; overflow: visible !important; }',
});
await page.screenshot({ path: 'section-content.png', fullPage: true });

This is not a universal fix. It changes the rendered page and may affect descendants or surrounding layout. If the overflow is intentional, an alternative is to scroll the nested element and capture it in multiple images; a single page-level full-page option will not automatically stitch every inner scroll position together.

3. Choose page or element capture for the content you want

Puppeteer’s screenshot guide uses Page.screenshot() for page captures and describes ElementHandle.screenshot() for a particular element. The current ElementHandle.screenshot() API says it scrolls the element into view if needed and then uses page screenshot capture. Scrolling the element into view does not remove clipping caused by CSS inside it.

Rank #3
Sale
Dell 24 Monitor - SE2426H - 23.8-inch FHD (1920x1080) 144Hz 1ms Display, in-Plane Switching (IPS) Technology, AMD FreeSync™, TÜV 3-Star 2X HDMI, Tilt
  • Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
  • Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
  • Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
  • In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
  • Ultra-thin bezels: Maximize your viewing experience with thin bezels.
const section = await page.$('.section');
if (!section) throw new Error('Section not found');
await section.screenshot({ path: 'section.png' });

Use this when you want the element as it is rendered, not necessarily every pixel of its independently scrollable contents. If the section itself clips text, first address the CSS constraint or capture its scrollable content through a method that matches your desired output.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

4. Treat viewport resizing as a conditional workaround

Increasing the viewport height can help in some cases where the desired element is clipped relative to the viewport, but it changes the conditions under which the page renders. A maintainer discussion records viewport-clipped element screenshots beginning with Puppeteer v2.0.0’s Chromium roll and explains that making the viewport page-height tall can change vh-based layout, fixed or sticky elements, lazy loading, and page shifts: Puppeteer issue #2423.

Only try a taller viewport if changing viewport semantics is acceptable. Compare the page at its normal viewport and the resized viewport, especially any fixed headers, sticky controls, responsive breakpoints, and content loaded near the bottom. If the layout changes, the resulting screenshot may not represent the page as intended.

5. Check timing and layout stability

Content that is still being inserted or resized can make a screenshot appear incomplete. Puppeteer’s screenshot guide includes navigation with waitUntil: 'networkidle2', but an example wait condition is not a guarantee that every application has finished rendering. Wait for the application’s own readiness signal, such as a known element or a completed render state, then inspect the section dimensions immediately before capture.

await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.waitForSelector('.section.is-ready');

const height = await page.$eval('.section', el => ({
  clientHeight: el.clientHeight,
  scrollHeight: el.scrollHeight,
}));
console.log(height);
await page.screenshot({ path: 'page.png', fullPage: true });

Replace the example URL and readiness selector with values from your application. If the app has no stable ready class, wait for its relevant data or rendering condition rather than assuming network quiet means all visible content is settled.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Sale
Samsung 27" Essential S3 (S36GD) Series FHD 1800R Curved Computer Monitor
  • CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
  • SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
  • MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
  • KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
  • INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient

6. Reproduce a narrow overflow-and-border rendering case only if it matches

Puppeteer issue #7578 documents a specific full-page screenshot case: at a 600px viewport width, the final horizontally scrollable pre block appeared empty with a combination of overflow and border styles. This report is a targeted edge case, not a general explanation for text being cut off at section bottoms.

If your CSS and symptom match, reduce the page to a minimal HTML reproduction, compare the affected viewport width, and isolate the relevant overflow and border styles. Do not apply a workaround based on this issue unless the reproduction demonstrates the same behavior.

7. Troubleshoot by symptom

What you see What to check Next step
The image stops at the viewport bottom even though the document is longer Whether the call sets fullPage: true, includes a clip, or relies on captureBeyondViewport. Match the screenshot options to the intended page, clip, or viewport capture.
Text is missing inside one section, while the rest of the page is present Computed height, maximum height, overflow, and whether the section has its own scrollbar. Decide whether to preserve the visible scroll area or render the section at full content height.
An element screenshot is still clipped Whether clipping occurs inside the element due to CSS rather than because it was outside the viewport. Adjust the element’s capture rendering or use a method suited to its scrollable content.
The screenshot changes after increasing viewport height vh sizing, fixed or sticky elements, responsive layout, and lazy-loaded content. Restore the intended viewport unless the taller layout is an acceptable capture target.
A final horizontally scrollable code block is blank Whether overflow and border styles match the narrow case in issue #7578. Build a minimal reproduction and isolate those styles before changing production CSS.
The amount of visible text varies between runs Late content insertion, image or font loading, and layout shifts before the screenshot. Wait for application-specific readiness and verify dimensions just before capture.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

8. A practical decision path

  1. Record the installed Puppeteer version and browser version, then consult the corresponding API behavior.
  2. Read the exact screenshot options and decide whether you need the viewport, full document, a clip, one element, or a nested section’s full scrollable contents.
  3. Inspect the affected section and ancestors for height constraints and overflow; compare scrollHeight with clientHeight.
  4. Check whether the page is stable at capture time using an application-specific readiness condition.
  5. Change only the factor implicated by those checks: capture options, section styling, capture target, or readiness timing.
  6. Compare the output with the original viewport and layout, then reduce unexplained behavior to a minimal reproduction before attributing it to a Puppeteer bug.

Or skip the browser setup

If you need a screenshot without maintaining a Puppeteer capture workflow, ScreenshotNeo provides a website screenshot API and MCP server. A single GET request can return an image or PDF; its capture options include full-page screenshots and selecting an element with a CSS selector. Cookie banners are accepted like a visitor and removed along with supported newsletter popups and chat widgets before capture. Bot checks, blank pages, and failed loads are not billed, and an MCP server lets AI agents take screenshots.

For a basic image request, replace the example URL and supply your API key. See the ScreenshotNeo API documentation for the available parameters.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Sale
Sceptre New 22-Inch Gaming Monitor, FHD 1080p, Up to 144Hz, HDMI, DisplayPort, Built-in Speakers, Machine Black (E225W-FW144 Series, 2026)
  • 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
  • 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
  • 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o shot.webp

The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Sign up for ScreenshotNeo to start with the free allowance.

Frequently Asked Questions

What details should I include when asking for help with a clipped Puppeteer screenshot?

Include the screenshot call and options, Puppeteer and Chromium versions, the relevant section HTML and computed CSS, whether the document or a nested element scrolls, and when the application considers the content ready.

Does `ElementHandle.screenshot()` capture all content in a scrollable section?

Not necessarily. It scrolls the element into view if needed, but CSS clipping inside the element can still limit what is rendered.

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.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.