Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
For a quick one-off, run Chrome with --headless --screenshot. For repeatable captures in an application, use Puppeteer’s page.screenshot(); it supports viewport, full-page, and element screenshots. Use Chrome DevTools Protocol (CDP) when you need low-level capture geometry or already have a CDP client, and consider Playwright if you want an alternative automation library.
Choose the capture method
| Method | Best for | Trade-off |
|---|---|---|
| Chrome command line | A quick screenshot without writing browser automation code | Less convenient for waiting on application-specific content or capturing a particular element |
| Puppeteer | Node.js automation with page, full-page, and element capture | Requires a script and explicit browser lifecycle management |
| Chrome DevTools Protocol | Existing services or tools that speak CDP, or direct control of capture geometry | Lower-level than Puppeteer; you manage protocol calls yourself |
| Playwright | Browser automation with viewport, element, full-page, and multiple image-format options | Uses a different library and API than Puppeteer |
The examples below target Chromium-based Chrome and Puppeteer. Chrome’s command-line behavior is documented by Chrome for Developers. Puppeteer’s screenshot API is documented in its screenshots guide and ScreenshotOptions reference.
Capture a screenshot from Chrome’s command line
If Chrome is installed and available as chrome in your shell, this captures a screenshot of the page at the supplied URL:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
chrome --headless --disable-gpu --screenshot https://example.com/
Chrome writes screenshot.png in the current working directory. Set a window size when you need a predictable capture area:
#1 Best Overall
- 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
chrome --headless --disable-gpu --screenshot --window-size=1280,1696 https://example.com/
This is the browser-window geometry for the command-line capture; it is not a substitute for setting an automation page’s viewport explicitly. If the output must have a particular viewport in a script, set the viewport before navigating or capturing.
Use Puppeteer for viewport, full-page, and element captures
Puppeteer is a JavaScript library for browser automation and screenshot generation. Its page-level method is page.screenshot(), and an element handle can capture just the selected element. Install Puppeteer in a Node.js project, then save this as an ES module, such as capture.mjs:
import puppeteer from 'puppeteer';
const url = process.argv[2] ?? 'https://example.com/';
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
await page.setViewport({
width: 1280,
height: 800,
deviceScaleFactor: 1,
});
await page.goto(url, { waitUntil: 'networkidle2' });
await page.screenshot({ path: 'viewport.png', type: 'png' });
await page.screenshot({ path: 'full-page.png', fullPage: true });
const hero = await page.waitForSelector('.hero');
if (!hero) {
throw new Error('Could not find .hero');
}
await hero.screenshot({ path: 'hero.png' });
} finally {
await browser.close();
}
Run it with:
node capture.mjs https://example.com/
The script makes three separate files: the visible viewport, the full document, and the element matching .hero. Change the selector to an element that exists on the target page. The finally block closes Chrome even if navigation or capture fails, which matters when this code runs repeatedly in a service or build job.
Recommended Free Tools
Viewport-only capture
page.screenshot() captures the current viewport by default. Specify path to write a file and type to select a supported image format. To capture a viewport image only, use:
await page.screenshot({ path: 'viewport.png', type: 'png' });
Full-page capture
Set fullPage: true to capture the document rather than just the visible viewport:
Rank #2
- 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
await page.screenshot({ path: 'full-page.png', fullPage: true });
Use this only when the entire page is required. A full-page image can be much taller than the viewport, while an element capture is often a better choice for a focused record of a component.
Capture one element
Wait for the target selector, then call screenshot() on the returned element handle:
const card = await page.waitForSelector('.pricing-card');
if (!card) throw new Error('Pricing card was not found');
await card.screenshot({ path: 'pricing-card.png' });
Waiting for the selector avoids trying to capture an element before it appears. The selector must match the page’s actual DOM; if it does not, the wait can fail rather than produce the intended image.
Set dimensions and choose an image format
For repeatable output, set viewport width, height, and device scale factor rather than relying on browser defaults. The Puppeteer example uses a 1280-by-800 CSS-pixel viewport and a device scale factor of 1. Change those values to match the layout you need. Chrome’s command line likewise accepts an explicit --window-size.
Select the output format based on what will consume the image:
Rank #3
- 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.
- PNG: lossless and generally a good fit for text, interfaces, and diagrams.
- JPEG: useful when photographic compression is acceptable.
- WebP: an option when the downstream application supports it.
Puppeteer’s screenshot options include supported encodings and quality controls. Quality is relevant to lossy formats; do not assume changing it has the same effect for PNG. Check the Puppeteer options reference for the exact options supported by the version installed in your project.
Free tools Windows power users keep installed
One-click scans. No signup required.
Wait for the page content you need
A navigation completion signal does not always mean every application-specific asset or data request is ready. The example uses waitUntil: 'networkidle2', a documented Puppeteer navigation wait policy. For a dynamic page, also wait for the particular content the screenshot must contain.
- Use
page.waitForSelector()for a critical element, such as a chart, product card, or rendered heading. - When fonts or images materially affect the result, wait for those assets or for a page-specific ready condition before calling
screenshot(). - Choose a fixed viewport and device scale factor when comparing captures or generating assets for a known layout.
- Prefer element capture when only one component is needed; use full-page capture when the complete document is the deliverable.
There is no single wait condition that can guarantee a particular site’s data, fonts, and images are ready. Match the wait to the page and the content being captured.
Use Chrome DevTools Protocol for lower-level control
CDP exposes screenshot capture through the Page domain. Enable that domain, then call Page.captureScreenshot. When you need a particular region, provide a clip with its x, y, width, height, and scale; the method also exposes screenshot encoding options. See the protocol’s Page.captureScreenshot documentation for the request fields and behavior.
CDP is useful when an existing automation system already speaks the protocol or when direct control over the capture request matters. For a standalone Node.js script that needs ordinary viewport, full-page, or element captures, Puppeteer provides a higher-level interface.
Rank #4
- 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
Use Playwright as an alternative
Playwright documents screenshots of the current viewport, a selected element, and the full scrollable page. It supports PNG, JPEG, and WebP, as well as CSS-pixel or device-pixel output. Its screenshot guide covers the library API; the CLI documentation describes screenshot commands and options including a target, --full-page, --filename, --type, and --hires.
If you are choosing between Puppeteer and Playwright for this task, both provide the central capture scopes discussed here. Use the one that fits the browser automation already present in your project; consult its current documentation for installation and version-specific options.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Troubleshoot common capture problems
The command says Chrome was not found
The shell cannot resolve chrome. Use the installed Chrome executable’s full path or configure your environment so the executable is on PATH. The command-line example assumes the executable is accessible under that name.
The screenshot has the wrong dimensions
Set the command-line window size with --window-size=WIDTH,HEIGHT, or set Puppeteer’s viewport with page.setViewport() before navigation. Also set deviceScaleFactor if the intended output depends on device-pixel scaling.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minuteThe page is missing data, images, or fonts
Do not treat navigation completion alone as proof that all visible content is ready. Wait for a page-specific selector or application-ready signal, and add asset-specific waiting where necessary. The correct condition depends on how that site loads content.
Best Value
- 【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.
The element capture fails or targets the wrong area
Check that the selector matches an element in the loaded page and wait for it before capturing. If the goal is a fixed rectangular region rather than a DOM element, CDP’s Page.captureScreenshot clip geometry is the lower-level alternative.
The full-page image is larger than needed
Remove fullPage: true to capture only the viewport, or use an element handle to save just the relevant component. Full-page mode intentionally captures the document instead of only the visible area.
Or skip the browser setup
ScreenshotNeo offers a screenshot API and MCP server for developers. A single GET request can return a PNG, JPEG, WebP, or PDF. Its clean-shot workflow accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each cleanup step can be turned off. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, with the page verdict and billing status reported in response headers. AI agents can use its MCP server tools, including take_screenshot, get_page_info, and capture_pdf. The Free plan includes 1,000 shots per month without a card; paid plans start at $5 for 3,000 shots. See the ScreenshotNeo site and API documentation.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com/ -o shot.webp
For the other supported client forms:
import requests
r = requests.get(
"https://api.screenshotneo.com/v1/shot",
params={"access_key": "YOUR_API_KEY", "url": "https://example.com/"},
timeout=90,
)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com/' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
For a free account with 1,000 screenshots a month and no card required, sign up for ScreenshotNeo.
Frequently Asked Questions
Can headless Chrome capture a page without opening a visible browser window?
Yes. The Chrome command-line example uses --headless, and Puppeteer’s browser automation can also run headlessly.
Does Puppeteer’s full-page option capture only what is currently visible?
No. fullPage: true captures the document rather than only the current viewport.
Can I capture an element instead of the whole page?
Yes. Wait for its selector and call screenshot() on the returned Puppeteer element handle.
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.

