October DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run ScanOctober DealsAmazon USDeal season is back - check today's better picksAmazon US: current deals, useful picks and tech finds.See Picks×
Skip to content
HTML

HTML to PNG Screenshots: Playwright, Puppeteer, and html2canvas

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

To turn a web page into a PNG, use a browser screenshot when the image should match what a browser actually renders. Playwright and Puppeteer capture the browser’s rendered page; html2canvas instead reconstructs an image from DOM information and supported styles, so it can differ from the visible page. The right choice depends on where your code runs, how much fidelity you need, and whether the target is a full page or one element.

Choose the capture method that fits the job

Need Good starting point Important check
PNG that reflects a browser-rendered page Playwright or Puppeteer Set the viewport, wait for content and assets, and choose the capture scope and pixel scale.
Capture one element in a browser Playwright locator screenshot or Puppeteer element screenshot Check clipping, scroll position, and whether the element is visible.
Capture from JavaScript running on the page html2canvas Check CSS support, external images, and iframe origins; compare the result with the browser display.
Predictable image dimensions Any method with explicit viewport and scale settings Distinguish CSS-pixel dimensions from device-pixel output.

Use Playwright or Puppeteer when fidelity to the browser matters. Consider html2canvas when the capture must be initiated in the page itself and the page’s styles and origins are compatible with its renderer.

Capture a page as PNG with Playwright

Playwright launches a real browser, navigates to the requested page, and saves its rendered pixels. The screenshot type defaults to PNG if you do not specify another type. Install Playwright and its browser before running this example:

npm install playwright
npx playwright install chromium

Save this as capture.mjs and run it with node capture.mjs:

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.
import { chromium } from 'playwright';

const browser = await chromium.launch({ headless: true });
try {
  const page = await browser.newPage({
    viewport: { width: 1440, height: 900 },
    deviceScaleFactor: 1
  });

  await page.goto('https://example.com', { waitUntil: 'networkidle' });
  await page.screenshot({
    path: 'page.png',
    fullPage: true,
    scale: 'css'
  });
} finally {
  await browser.close();
}

Replace https://example.com with the page you are authorized to capture. The explicit viewport makes the layout basis clear. fullPage: true captures the full scrollable page rather than only the visible viewport. scale: 'css' produces one output pixel per CSS pixel; scale: 'device' uses device pixels and can produce a larger image. Choose deliberately, especially when comparing screenshots or preparing images for a specific size.

Capture a single element

A locator screenshot is useful for a card, chart, or other visible component. Ensure the locator matches one intended element and allow the page to finish laying it out:

import { chromium } from 'playwright';

const browser = await chromium.launch({ headless: true });
try {
  const page = await browser.newPage({ viewport: { width: 1280, height: 800 } });
  await page.goto('https://example.com', { waitUntil: 'networkidle' });
  await page.locator('.report-card').screenshot({ path: 'card.png' });
} finally {
  await browser.close();
}

If the result is clipped or the target is not ready, check the locator’s dimensions and visibility and wait for the relevant content before capturing. For pages that load data after navigation, wait for a page-specific selector instead of assuming navigation completion means the content is ready.

Control transparency and visual variation

For a transparent background, use omitBackground: true where the page’s rendering supports it. Playwright also provides screenshot options for masking elements, disabling animations, and applying a stylesheet at capture time. These are useful for hiding volatile details or reducing motion-related differences in a visual test.

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

A screenshot is not guaranteed to be pixel-identical across computers just because the code is the same. Playwright identifies host operating system, browser version, settings, hardware, power source, and headless mode as factors that can affect rendering. For repeatable comparisons, keep the browser and runtime environment consistent, set viewport and scale explicitly, and control animation and page readiness.

Capture a page or element with Puppeteer

Puppeteer also captures the browser-rendered page. Install it, then save the following as capture.cjs and run node capture.cjs:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  try {
    const page = await browser.newPage();
    await page.setViewport({ width: 1440, height: 900 });
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });
    await page.screenshot({ path: 'page.png', fullPage: true });
  } finally {
    await browser.close();
  }
})();

For an element capture, locate the element and call its screenshot method:

const card = await page.$('.report-card');
if (!card) throw new Error('Could not find .report-card');
await card.screenshot({ path: 'card.png' });

Use Puppeteer’s element screenshot when the target itself—not the entire viewport—is the deliverable. Like any element capture, it depends on selecting the correct element and having it rendered and visible.

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

Use html2canvas for an in-page capture

html2canvas runs in the browser and creates a canvas by reading DOM information and rebuilding the image. It does not take a literal screenshot of the browser surface. As a result, its output may not exactly match the page, and CSS properties it does not understand may render incorrectly.

Install the package in a project using a bundler, then import it where needed:

npm install html2canvas
import html2canvas from 'html2canvas';

const element = document.querySelector('#report');
if (!element) throw new Error('Could not find #report');

const canvas = await html2canvas(element, {
  useCORS: true,
  scale: 1
});

const link = document.createElement('a');
link.download = 'report.png';
link.href = canvas.toDataURL('image/png');
link.click();

This example captures one element and prompts a PNG download. To render the whole document, pass document.body instead. The library also supports crop coordinates and dimensions, which can be useful when only part of an element is wanted. Its scale option affects output resolution; check the resulting canvas dimensions rather than assuming they match CSS dimensions.

Understand cross-origin restrictions

Images generally need to be same-origin or made available with proxy assistance for the canvas output to include them. The useCORS option can request cross-origin image loading, but it does not override a remote server’s access-control policy. Cross-origin iframe documents cannot be read through the browser’s security boundaries. If the target depends on such content, an in-page DOM reconstruction may not be a workable route; use a browser screenshot where you control the rendered browser context instead.

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.

Make screenshots reliable and useful

  • Define the capture area. Decide between the viewport, the full scrollable page, and a single element. Full-page output can be much taller than a typical image and may expose layout behavior that is not visible in the initial viewport.
  • Set dimensions and scale. Choose an explicit viewport and state whether output pixels should correspond to CSS pixels or device pixels. Device scaling can increase image dimensions and file size.
  • Wait for the actual content. A navigation event is not proof that a chart, client-rendered component, or lazy image has finished. Wait for a meaningful selector or condition, then capture.
  • Stabilize animation and changing content. Disable animation where appropriate, and mask or hide timestamps and other elements that change between runs.
  • Check the output, not just the exit code. Open the PNG and verify expected content, dimensions, transparency, and image loading. An apparently successful capture can still show an incomplete or unexpected page.
  • Keep visual-test environments consistent. Browser version and host differences can change rendering. Do not treat cross-machine pixel identity as automatic.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Troubleshoot common failures

The PNG is blank or missing page content

The capture may happen before client-side rendering finishes, or the requested page may have failed to load. Wait for a selector tied to the content rather than relying only on navigation completion. Check the page URL, browser console, and output image. For a service-side browser, distinguish a genuinely blank page from a completed capture.

Images are absent from an html2canvas result

Check whether each image is same-origin and whether the remote server permits cross-origin access. useCORS: true can help only when the image host allows it. A cross-origin iframe is a separate restriction and cannot be made readable merely by enabling that option.

Styles differ from what the browser shows

With html2canvas, confirm that the relevant CSS is supported by its renderer; it reconstructs the page rather than sampling the rendered browser surface. If close visual fidelity is essential, capture with Playwright or Puppeteer instead.

The target element is clipped or absent

Verify the selector, visibility, and element dimensions before taking the screenshot. Wait for the element to appear and for its content to settle. For an element capture, check whether scrolling or overflow clipping changes the area that is included.

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

Repeated screenshots do not match

Use the same browser version, operating system, viewport, scale, and rendering mode where possible. Disable animation and account for dynamic data. Differences can come from the environment as well as the page.

Or skip the browser setup

For a hosted capture, ScreenshotNeo accepts a URL and returns a screenshot image. This cURL example writes a WebP image; change the URL to the page you want to capture:

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 API documentation for request options. ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, and failed loads are never billed. Its MCP server lets AI agents take screenshots, and the free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Learn about ScreenshotNeo, then sign up for the free plan.

FAQ

Can I save a browser screenshot as a PNG without specifying its type?

Yes. Playwright defaults screenshots to PNG when no other screenshot type is specified.

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

Does html2canvas capture exactly what the browser displays?

No. It reconstructs an image from DOM information and supported styles, so the result can differ from the browser rendering.

Will device-scale screenshots have the same dimensions as CSS-scale screenshots?

Not necessarily. Device scale uses device pixels and can create a larger image, while CSS scale uses one output pixel per CSS pixel.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *

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

Read next

Recommended PC Tool
Recommended PC Tool
Outdated Drivers Are Slowing You DownFree scan - exact matches
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.