Free tools Windows power users keep installed
One-click scans. No signup required.
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.
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().
#1 Best Overall
| 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.
- Install the library and a browser.
npm install -D playwright npx playwright install chromium - 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(); })(); - 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.
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.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallElement 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.
Rank #3
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.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →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.
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.
Recommended Free Tools
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.
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.

