ScreenshotNeo

BlogGuides

What Is the Playwright Browser and How Does It Work?

Playwright is a browser automation framework, not a standalone browser. Learn how engines, contexts, pages, projects, and browser binaries work.

By the ScreenshotNeo team1 October 20269 min read

Playwright is browser automation software, not a separate browser that people install for everyday web browsing. A Playwright program launches a supported browser engine, creates an isolated browser session, opens one or more pages, and then navigates or interacts with those pages through code. It is used for end-to-end testing, web scripting, and AI agent workflows.

The main engines are Playwright-managed Chromium, Firefox, and WebKit. You can also configure branded Chrome or Edge channels. Playwright downloads browser binaries that match the installed Playwright version, so updating Playwright can require installing its corresponding browsers again. Read the official overview and the browser installation guide.

How the Playwright browser works

  1. Launch a browser engine. Your code calls a browser type such as Chromium, Firefox, or WebKit.
  2. Create a BrowserContext. A context is an isolated browser session with its own cookies, cache, permissions, locale, viewport, and other settings.
  3. Create a Page. A page represents a tab or popup inside the context.
  4. Navigate and interact. The page API loads URLs, locates elements, clicks, fills forms, evaluates scripts, and reads content.
  5. Close resources. Close contexts before the browser when you create them directly, so context resources and artifacts can finish cleanly.

Several contexts can share one browser process while remaining isolated from one another. A context can contain multiple pages, and pages in the same context share that context’s state. Playwright Test normally creates a fresh context and page for each test, reducing state leakage between tests. See the browser context guide and pages guide.

Playwright’s browser engines

Engine or channel What it means When to choose it
Chromium Playwright’s open source Chromium build Chromium-based behavior and a consistent automated environment
Firefox Playwright’s Firefox build, which uses Playwright patches Firefox coverage in automated tests
WebKit A WebKit build derived from WebKit sources; it is not the branded Safari application WebKit-style coverage, with macOS WebKit recommended for cases needing the closest Safari-like behavior
Chrome channel A branded Chrome installation selected through a channel Testing behavior tied to installed Chrome
Edge channel A branded Edge installation selected through a channel Testing behavior tied to installed Edge

Engine behavior can vary by operating system. The official browser documentation calls out platform-dependent differences such as media codec availability. Treat Playwright’s managed browsers and branded channels as related but distinct configurations; WebKit is not a promise of identical behavior to every Safari release. Check the current browser documentation before pinning a version.

Browser, BrowserContext, and Page explained

Browser

A Browser is the launched browser process. Launch it through a browser type such as chromium, firefox, or webkit. One process can host multiple isolated contexts.

BrowserContext

A BrowserContext is an isolated session. Contexts created with browser.newContext() do not share cookies or cache, and non-persistent contexts do not write browsing data to disk. Use separate contexts for separate users, test cases, locales, or authentication states.

Page

A Page is a tab or popup in a context. Pages inherit the context’s emulation and routing settings. Multiple pages can therefore represent a multi-tab workflow while sharing one session.

Runnable Node.js example

Install Playwright and its browser binaries first:

npm install -D playwright
npx playwright install chromium

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

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

(async () => {
  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext({
    viewport: { width: 1440, height: 900 },
    locale: 'en-US'
  });
  const page = await context.newPage();

  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  await page.screenshot({ path: 'example.png', fullPage: true });
  console.log(await page.title());

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

For a branded browser channel, configure a channel when launching, for example chromium.launch({ channel: 'chrome' }), and make sure that browser is installed on the machine.

Runnable Python example

Install the Python package and browser binary:

pip install playwright
playwright install chromium

Save this as capture.py and run python capture.py:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    context = browser.new_context(
        viewport={"width": 1440, "height": 900},
        locale="en-US",
    )
    page = context.new_page()
    page.goto("https://example.com", wait_until="domcontentloaded")
    page.screenshot(path="example.png", full_page=True)
    print(page.title())
    context.close()
    browser.close()

What cURL can and cannot do

cURL is an HTTP client, not a browser automation engine. It can request a URL and inspect the response, but it does not execute a full browser session with layout, JavaScript interaction, cookies isolated per context, or screenshots. Use Playwright when you need browser behavior. A basic HTTP request looks like this:

curl -L https://example.com

For a screenshot without maintaining browser binaries yourself:

Or skip the browser setup

ScreenshotNeo provides a website screenshot API and MCP server. One GET request returns a PNG, JPEG, WebP, or PDF. Its capture flow accepts cookie and consent banners like a visitor, then removes more than 60 known consent platforms, newsletter popups, and chat widgets before the shot. Each step can be turned off.

Only clean shots are billed. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and the response identifies the result with X-Page-Verdict and X-Billed headers. The MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.

See the ScreenshotNeo API documentation for all options.

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)
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}`);

ScreenshotNeo includes full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets plus custom viewports, retina scale, PDF paper sizes and page ranges, HTML/CSS rendering, custom CSS and JavaScript, pre-capture clicks, hidden selectors, selector or network-idle waits, request and resource blocking, custom headers, cookies, user agents and Authorization, timezone and geolocation, transparent backgrounds, resizing, configurable caching TTLs, signed image links, asynchronous jobs with signed webhooks, bulk capture for 100 URLs per call, a usage API, and an OpenAPI specification. Existing parameter names used by other screenshot APIs also work to ease migration.

There is a free plan with 1,000 screenshots per month and no card. Paid plans start at $5 for 3,000 screenshots; every feature is available on every plan. Start with 1,000 free screenshots a month—no card required.

Installing and updating Playwright browsers

Playwright versions expect specific browser binaries. Install the browsers through the Playwright CLI after installing or upgrading the package:

npx playwright install
# or, for Python
playwright install

In CI, install only the engines your projects use to reduce setup time and cache the downloaded browser directory according to your CI provider’s guidance. When a version update reports a missing executable, rerun the install command with the updated package.

Headed versus headless execution

Headless mode runs without a visible window and is the usual choice for CI, screenshots, and batch jobs:

const browser = await chromium.launch({ headless: true });

Use headed mode while diagnosing selectors, navigation, or rendering:

const browser = await chromium.launch({ headless: false });

Headed execution requires a graphical environment. On a headless Linux runner, use the environment’s supported display setup or stay in headless mode.

Contexts, authentication, and test isolation

Keep independent users or tests in independent contexts:

const alice = await browser.newContext();
const bob = await browser.newContext();

const alicePage = await alice.newPage();
const bobPage = await bob.newPage();

await alicePage.goto('https://example.com');
await bobPage.goto('https://example.com');

await alice.close();
await bob.close();

Do not put shared mutable state in a global page when tests need isolation. If you intentionally reuse login state, document who owns the state and reset it between tests. Playwright Test’s fixture model supplies a clean context per test by default. See the fixtures API.

Projects and cross-browser coverage

Playwright Test projects are named groups of tests with shared configuration. A project can select an engine, branded browser channel, device profile, locale, permissions, or logged-in state. Run all projects for a browser matrix, or select one project while debugging. Read the projects guide.

// playwright.config.js
const { defineConfig, devices } = require('@playwright/test');

module.exports = defineConfig({
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },
    { name: 'webkit', use: { ...devices['Desktop Safari'] } },
  ],
});

Projects help expose engine-specific failures, but they do not make every test reliable automatically. Use stable locators, deterministic test data, and failure traces.

Waiting and interaction behavior

Prefer locator-based actions and assertions. Playwright’s test tooling includes auto-waiting and assertions, which can reduce timing races when an element is not immediately ready. Explicitly wait for a meaningful condition when the application has a known asynchronous state:

await page.goto('https://example.com');
await page.getByRole('link', { name: 'More information' }).click();
await page.waitForURL('**/iana.org/domains/example');

A fixed timeout can be useful for a short diagnostic experiment, but it is usually less reliable than waiting for a selector, URL, response, or application state.

Common errors and fixes

Error or symptom Cause Fix
Executable doesn’t exist The browser binary for this Playwright version is missing Run npx playwright install or playwright install; repeat after upgrading Playwright
Browser fails to launch in CI Missing system dependencies, sandbox restrictions, or an unavailable display Use the documented CI installation flow, run headless, and inspect the launch error for the missing dependency
Timeout while clicking or locating The locator is wrong, the element is not visible, or the page is still changing Use a role, label, or test id locator; wait for the relevant state; inspect a trace or headed run
Tests affect one another Cookies, storage, or server data are shared Create a fresh context per test or user and reset shared server-side fixtures
Firefox or WebKit differs from Chrome Engines and operating systems have real compatibility differences Run the failing project directly, verify the intended engine and OS, and avoid assuming WebKit equals branded Safari
Popup is missed The new page is created during an action and no listener is attached Wait for the page event while performing the action, then interact with the returned page
Screenshot is incomplete Lazy content has not loaded or the capture happened before the final state Scroll or wait for the content’s ready condition, then use fullPage: true when appropriate
Navigation hangs The site never reaches the selected load condition, or a resource is stalled Choose a suitable wait condition, set a deliberate timeout, and inspect network or page errors

Performance and reliability practices

  • Reuse a launched browser for related work, but keep independent users in separate contexts.
  • Close contexts and browsers in cleanup handlers, including when a test fails.
  • Run only the browser projects needed for a change; use the full matrix before release.
  • Cache browser downloads in CI and pin compatible Playwright versions in lockfiles.
  • Prefer condition-based waits over long fixed sleeps.
  • Use tracing, assertions, and parallelism deliberately; parallel tests still need isolated data and non-conflicting resources.
  • Measure your own workload when choosing concurrency. Page complexity, network latency, media, and the selected engine affect runtime.

Security and data considerations

Contexts isolate browser state inside the Playwright process, but they do not replace application-level authorization. Avoid placing production credentials in source files or traces. Treat screenshots, downloaded files, cookies, and storage state as sensitive artifacts, and clean them up according to your retention policy.

Playwright versus a normal browser

Question Playwright automation Manual browser use
Who controls navigation? Program code A person
How is state managed? Contexts can be created and discarded in code Usually a persistent user profile
Why use it? Repeatable tests, scripts, screenshots, and agent workflows Interactive browsing
Browser choices Managed engines, plus configured Chrome or Edge channels Installed branded browsers

FAQ

Is Playwright a browser?

No. It is an automation framework that launches and controls browser engines.

Does Playwright include browsers?

Playwright provides commands to download compatible browser binaries, but installing the package and installing those binaries are separate steps.

What is the difference between a browser and a BrowserContext?

The browser is the launched process. A BrowserContext is an isolated session inside it, with its own cookies, cache, and settings.

Can Playwright automate Safari?

Playwright can run its WebKit build and can provide Safari-like coverage, but WebKit is not the branded Safari application. For the closest Safari behavior, the documentation recommends WebKit on macOS for relevant cases.

Should every test launch a new browser?

No. Reuse a browser process and create isolated contexts unless your workflow specifically requires separate processes.

When should I use ScreenshotNeo instead?

Use ScreenshotNeo when you need a screenshot or PDF API without managing Playwright installation, browser binaries, and capture cleanup yourself. It also provides an MCP server for AI agents and bills only clean shots.

Summary

Think of Playwright as a programmable control layer over browser engines: launch a browser, create isolated contexts, open pages, perform actions, assert results, and close resources. Chromium, Firefox, WebKit, and optional Chrome or Edge channels let a project cover different browser configurations, while Playwright Test projects organize that matrix. For a managed screenshot endpoint with consent cleanup, verdict headers, MCP tools, and a free starting tier, create a ScreenshotNeo account.