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.

To capture part of a browser page, pass a clip rectangle to the screenshot method: x and y identify the top-left origin, while width and height define the requested area. If the target is a known DOM element, an element-level screenshot is usually clearer than measuring coordinates. These browser APIs capture web pages, not arbitrary desktop applications or the operating-system screen.

For a managed option, ScreenshotNeo is the first service to try because it removes consent banners, popups and chat widgets before capture, bills only clean shots, and has a $5 paid plan.

Choose coordinates or an element selector

There are two fundamentally different questions behind “part of the screen.” Decide which one you mean before writing code.

Use a clip rectangle for a fixed visual region

A clip rectangle is useful when the region is defined by its position in the page viewport—for example, the 320-by-180 area beginning 40 pixels from the left and 80 pixels from the top. Playwright documents the four fields as x, y, width and height in its Page API reference. The values below are illustrative coordinates, not measurements from a particular site.

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.

Use an element screenshot for a DOM target

If the desired content already has a stable selector, ask the library to capture that element. This avoids guessing its position after responsive layout, fonts, or dynamic content change. Playwright exposes page.locator(selector).screenshot(); Puppeteer exposes ElementHandle.screenshot().

Need Best fit Why
Managed capture without running a browser yourself ScreenshotNeo Clean shots, only clean shots billed, and the lowest paid plan.
Known page coordinates Playwright or Puppeteer clip Captures exactly the requested rectangle.
A named DOM component Playwright locator or Puppeteer element handle The browser finds and scrolls to the element.
The entire scrollable page Playwright fullPage or Puppeteer fullPage Produces a tall page image rather than a crop.

Capture a rectangle with Playwright (JavaScript)

Playwright’s official Screenshots guide supports a clip area, image format and quality, saving to a file, and returning image bytes.

  1. Install the library and a browser.
    npm install -D playwright
    npx playwright install chromium
  2. Create a script. The clip object uses the page’s coordinate system. Check the current Playwright documentation for valid bounds and coordinate behavior in your version.
    const { chromium } = require('playwright');
    
    (async () => {
      const browser = await chromium.launch();
      const page = await browser.newPage({ viewport: { width: 1280, height: 800 } });
      await page.goto('https://example.com', { waitUntil: 'networkidle' });
    
      await page.screenshot({
        path: 'region.png',
        clip: { x: 40, y: 80, width: 320, height: 180 }
      });
    
      await browser.close();
    })();
  3. Run it.
    node capture-region.js

The result is written as region.png. For in-memory processing instead of a file, omit path and keep the returned buffer:

const imageBytes = await page.screenshot({
  type: 'png',
  clip: { x: 40, y: 80, width: 320, height: 180 }
});
// imageBytes is a Buffer; upload or transform it here.

Use the coordinates only after the page has reached the layout state you intend to capture. A late-loading banner can move every element and make an otherwise correct rectangle miss its target.

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

Capture a DOM element with Playwright

When the region is identifiable in HTML, a locator is less fragile than hard-coded coordinates:

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');

  const header = page.locator('.header');
  await header.screenshot({ path: 'header.png', type: 'png' });

  await browser.close();
})();

Replace .header with a selector that identifies exactly one intended element. Prefer a semantic ID, data attribute, or component selector over a deeply nested path. If the element is hidden or not yet attached, wait for it explicitly:

await page.locator('[data-testid="invoice"]').waitFor({ state: 'visible' });
await page.locator('[data-testid="invoice"]').screenshot({ path: 'invoice.png' });

Capture a rectangle or element with Puppeteer

Puppeteer’s JavaScript documentation describes both Page.screenshot() and ElementHandle.screenshot(). Its ScreenshotOptions reference is versioned here as 25.12.0; verify names and defaults if your installed version differs.

Coordinate clip

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.setViewport({ width: 1280, height: 800 });
  await page.goto('https://example.com', { waitUntil: 'networkidle2' });

  await page.screenshot({
    path: 'region.png',
    clip: { x: 40, y: 80, width: 320, height: 180 }
  });

  await browser.close();
})();

Puppeteer documents captureBeyondViewport as false when there is no clip and true when a clip is supplied, unless you set it explicitly. Treat that as behavior for the documented configuration, not a universal rule for other libraries.

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

Element capture

const fileElement = await page.$('.header');
if (!fileElement) throw new Error('Element not found');
await fileElement.screenshot({ path: 'header.png' });

Puppeteer’s element screenshot method attempts to scroll a hidden element into view. It still needs a selector that resolves to the intended element.

Understand output, format and full-page options

File versus bytes

Playwright can save directly to a path or return image bytes in a buffer. Puppeteer uses the filename extension to infer the image type when path is supplied; binary output is the default encoding, and base64 is available when requested. Puppeteer documents PNG as the default image type. Its quality option applies to JPEG/WebP output, not PNG.

Clip versus full page

A clip is a bounded rectangle in the current page view. A full-page screenshot is different: Playwright describes it as the entire scrollable page, “as if you had a very tall screen and the page could fit it entirely.” Puppeteer provides a separate fullPage option. Do not combine a full-page requirement with a small clip unless you have confirmed the exact behavior in your library version.

Image dimensions and device scale

Coordinate semantics are library- and configuration-dependent. Viewport CSS pixels, device scale factor, browser zoom, and the library’s screenshot implementation can affect the final pixel dimensions. The reviewed documentation defines the clip fields but does not establish one universal coordinate or device-scale rule for every screenshot API. Set your viewport deliberately and verify a representative image in the exact library version you deploy.

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

Make captures deterministic

Wait for the right state

networkidle or networkidle2 can help, but network activity alone does not prove that a chart, font, or image is visually ready. For important captures, wait for a selector that represents completion, and add a short, documented delay only when the page requires animation time.

await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.locator('#report-ready').waitFor({ state: 'visible' });
await page.screenshot({ path: 'report.png', clip });

Control layout inputs

  • Set a fixed viewport and, when needed, a fixed device scale factor.
  • Use a consistent browser engine and version in local and CI environments.
  • Disable or wait out animations if a moving element can land between frames.
  • Scroll to the target or use an element screenshot when the target is below the fold.
  • Authenticate before capture and verify that redirects have completed.

Validate the rectangle

Check that x and y are not negative, that width and height are positive, and that the requested area lies within the bounds accepted by your selected API. For responsive pages, record the viewport and URL alongside the image so a later crop can be reproduced.

Troubleshooting

Symptom Likely cause Fix
The image is blank or mostly white The page failed to load, a redirect is still in progress, or the clip misses the content. Log the final URL, wait for a meaningful selector, and temporarily capture the full viewport to inspect coordinates.
The wrong part of the page appears A cookie banner, responsive breakpoint, font, or late image changed layout. Set viewport dimensions, handle overlays, wait for the target state, or switch to a locator screenshot.
“Element not found” The selector is wrong, the element is inside a frame, or it has not been inserted yet. Confirm the selector in the page, wait for attachment/visibility, and use the correct frame context.
The clip is rejected Dimensions or origin are outside the bounds accepted by the library. Use non-negative coordinates and smaller dimensions, then consult the current API reference for that version.
The element screenshot is cut off The element has overflow, transforms, or content that is still loading. Wait for rendering, inspect computed bounds, and decide whether a page clip or full-page capture is more appropriate.
JPEG quality has no effect The output is PNG. Choose JPEG or WebP explicitly; Puppeteer’s quality setting does not apply to PNG.
Works locally but fails in CI Different browser binaries, fonts, viewport, permissions, or network access. Install the pinned browser, set the viewport explicitly, provide required credentials, and retain failure screenshots and logs.

Performance, reliability and cost decisions

A local Playwright or Puppeteer process gives you control over browser version, authentication and post-processing, but you operate browser binaries, concurrency, retries, fonts and network access. Reusing a browser process while creating separate pages can reduce launch overhead; cap concurrency so memory use does not destabilize captures. The cited documentation does not establish a performance winner between Playwright and Puppeteer, so choose based on the API and runtime you already support.

For a single or occasional crop, a local script is often simplest. For a service, define timeouts, retry only transient navigation failures, record the final URL and page verdict, and avoid treating a successful HTTP response as proof that the screenshot contains useful content. Never silently bill a user for a failed capture in your own system.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo is a hosted website screenshot API and MCP server. One GET request returns PNG, JPEG, WebP or PDF; its feature set includes full-page capture with lazy images loaded and capture of one element by CSS selector. For a DOM region, use the selector option documented at ScreenshotNeo’s API documentation rather than maintaining Playwright or Puppeteer in your application.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot failed: ${res.status}`);
const image = Buffer.from(await res.arrayBuffer());

Before capture, ScreenshotNeo accepts the cookie or consent banner like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads and cache hits cost nothing, and every response identifies the page verdict and whether it was billed with X-Page-Verdict and X-Billed headers. It also offers custom CSS and JavaScript, waits, request blocking, headers, cookies, user agents, authorization, timezone and geolocation, caching with a chosen TTL, signed links, asynchronous jobs with signed webhooks, bulk capture for 100 URLs per call, usage data, an OpenAPI specification, and an MCP server with take_screenshot, get_page_info and capture_pdf for Claude, Cursor and other MCP clients.

Plan Allowance and price
Free 1,000 shots per month, no card
Starter $5 for 3,000 shots
Growth $15 for 15,000 shots
Pro $39 for 60,000 shots
Scale $99 for 250,000 shots
Business $249 for 1,000,000 shots

Every feature is included on every plan, and yearly billing provides two months free. If you want managed capture instead of browser maintenance, create a free ScreenshotNeo account with 1,000 screenshots each month and no card.

Frequently Asked Questions

Can these APIs capture an application window or my whole desktop?

No. The documented Playwright and Puppeteer screenshot methods capture browser pages or DOM elements. Capturing arbitrary desktop applications requires an operating-system or desktop-capture tool.

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

Should I use a clip or an element screenshot for a responsive component?

Use the element method when a stable selector identifies the component; use a clip when the requirement is a fixed visual rectangle independent of DOM structure.

How can I process the image without writing a temporary file?

Playwright returns screenshot bytes when you omit the path, and Puppeteer supports binary output by default; pass those bytes directly to your upload or image-processing code.

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.