PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Crashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteShort answer: install the browser through your automation framework unless you need a pinned Chrome/ChromeDriver pair. Use current Chrome Headless with the --headless flag. Puppeteer downloads a compatible Chrome for Testing automatically, Playwright downloads its supported Chromium build, and Selenium/WebDriver requires a compatible Chrome and ChromeDriver (or a supported automatic manager).
The old, separate headless implementation is now distributed as chrome-headless-shell; it is an optional binary, not the default installation path for every project.
What “Headless Chrome” means now
Since Chrome 112, headless mode uses the regular Chrome implementation without showing its platform windows. The same Chrome binary can run with or without a visible UI. Start it with --headless. Chrome 132.0.6793.0 introduced the former separate implementation as the standalone chrome-headless-shell binary through Chrome for Testing. Choose the shell only when your framework or CI job specifically benefits from that smaller, dedicated runtime.
Headless is a runtime mode, not a separate operating system package. Your installation decision is therefore driven by the framework, browser channel (framework Chromium, Chrome for Testing, or branded Google Chrome), operating system and CPU architecture, and whether a WebDriver driver must match the browser.
#1 Best Overall
Choose the installation path
| Framework or use case | Recommended installation | What it manages | Important caveat |
|---|---|---|---|
| Puppeteer | npm i puppeteer |
Compatible Chrome for Testing and headless shell downloads | Blocked package-install scripts can cause “Could not find Chrome.” |
| Selenium/WebDriver | Chrome for Testing plus matching ChromeDriver, or your framework’s supported manager | WebDriver controls the browser; you control version pairing | Pin both binaries for deterministic CI. |
| Playwright | npx playwright install |
Playwright-supported Chromium builds | Branded Chrome and Edge are not installed by default. |
| Headless-shell-only CI | npx playwright install --with-deps --only-shell (Playwright) |
Headless shell and Linux dependencies | Use only when you do not need the full Chromium browser. |
Prerequisites to check first
Runtime and architecture
Check your framework’s current requirements before installing. Puppeteer 25.12.0 documents Node.js 22.12 or newer and Chrome for Testing support on Windows x64, macOS x64/arm64, Debian/Ubuntu Linux x64/arm64, and openSUSE/Fedora Linux x64/arm64. These are Puppeteer requirements, not universal requirements for every Chrome installation. Versions and supported platforms change.
On Debian or Ubuntu, bare images commonly lack libraries needed for Chromium. Puppeteer also requires tools such as unzip or tar to unpack downloaded browsers. Google’s current desktop Chrome page lists Windows 10+ for Intel systems (Windows 11+ for ARM), macOS 13 Ventura+, and 64-bit Ubuntu 18.04+, Debian 10+, openSUSE 15.5+ or Fedora 39+. A framework-managed browser can have a different support matrix.
Decide whether you need branded Chrome
- Use framework-managed Chromium or Chrome for Testing for repeatable automated tests.
- Use branded Google Chrome only when you must test the exact consumer channel or an enterprise-managed installation.
- For Selenium, select a Chrome for Testing version and the corresponding ChromeDriver version rather than downloading an arbitrary driver from an old tutorial.
Install and run Headless Chrome with Puppeteer
1. Install the package
- Use a supported Node.js release.
- From your project directory, run
npm i puppeteer. - Allow the package’s install script to download Chrome for Testing and
chrome-headless-shell.
Puppeteer normally downloads a compatible browser automatically. Package managers or security policies that disable dependency install scripts can skip that step. If you see Could not find Chrome, review Puppeteer’s configuration for an explicit browser download or custom cache location, then reinstall with scripts enabled according to your package manager’s security policy.
2. Capture a page in current headless mode
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.screenshot({ path: 'example.png', fullPage: true });
await browser.close();
})();
headless: true selects current Chrome Headless. headless: false opens a visible browser for debugging. headless: 'shell' selects the separately distributed headless-shell binary when that is your intentional choice.
3. Install Linux dependencies when needed
On Debian or Ubuntu, Puppeteer’s browser CLI can install Chrome and required system packages:
sudo npx puppeteer browsers install chrome --install-deps
The command requires root privileges. Minimal containers can still need additional, image-specific troubleshooting if libraries, fonts, sandbox permissions or shared-memory settings are restricted.
Install Headless Chrome for Selenium/WebDriver
1. Pair the browser and driver
WebDriver needs a Chrome binary and a compatible ChromeDriver. Chrome’s automation guidance recommends matching Chrome for Testing and ChromeDriver versions. A supported WebDriver framework may manage these downloads; otherwise obtain both from the same Chrome for Testing release and pin their versions in CI.
2. Launch Chrome headless (Python example)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
options.add_argument('--window-size=1365,900')
driver = webdriver.Chrome(options=options)
try:
driver.get('https://example.com')
driver.save_screenshot('example.png')
finally:
driver.quit()
If Chrome is not on PATH, configure the browser binary location in your framework. If ChromeDriver is managed separately, configure its executable path or manager according to that framework’s current API. Do not copy a historical “download this driver version” recipe without checking the active Chrome for Testing release.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
3. Make CI reproducible
- Pin the Chrome for Testing version and matching ChromeDriver version.
- Cache those exact archives between jobs, while invalidating the cache when the version changes.
- Record the browser, driver, operating system and architecture in job logs.
- Use a visible browser temporarily (
--headlessremoved) when diagnosing rendering or authentication problems.
Install Headless Chrome for Playwright
Full Playwright Chromium
- Add Playwright to the project with your preferred package manager.
- Run
npx playwright installto download its supported browser builds. - On Linux, include
--with-depswhen you want Playwright to install documented system dependencies:npx playwright install --with-deps.
Headless shell only
For CI jobs that never launch full Chromium and do not select a branded channel, Playwright documents:
npx playwright install --with-deps --only-shell
Playwright can use an already installed branded Google Chrome or Microsoft Edge, but it does not install those branded browsers by default. Select the channel explicitly in your Playwright configuration when that is required, and keep in mind that branded auto-updates can reduce reproducibility.
Basic Playwright launch
import { chromium } from 'playwright';
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle' });
await page.screenshot({ path: 'example.png', fullPage: true });
await browser.close();
Run Chrome directly without a framework
When Chrome is already installed, the command-line mode is straightforward:
- Linux:
google-chrome --headless --dump-dom https://example.com - macOS:
open -a "Google Chrome" --args --headless --dump-dom https://example.com - Windows:
start chrome --headless --dump-dom https://example.com
Use a framework when you need waits, cookies, selectors, network interception, screenshots or structured test assertions. The direct command is useful for smoke tests and diagnostics.
Recommended Free Tools
Common installation and runtime failures
“Could not find Chrome” in Puppeteer
Cause: the install script was blocked, the browser cache was moved, or downloads were disabled. Fix: permit the documented browser download, run the Puppeteer browser installer, or set the configured executable/cache path deliberately.
Chrome starts and exits immediately on Linux
Cause: missing shared libraries, fonts, sandbox permissions or container resources. Fix: install framework-recommended dependencies (for example, Puppeteer’s --install-deps flow or Playwright’s --with-deps), use a supported base image, and inspect stderr rather than repeatedly retrying.
Session creation or “cannot connect” errors in Selenium
Cause: Chrome and ChromeDriver are incompatible, or the driver points to a different browser on PATH. Fix: print both versions, install a matching Chrome for Testing pair, and ensure your manager is resolving the intended binaries.
Tests pass locally but fail in CI
Cause: an auto-updated local browser, different architecture, missing fonts, a smaller shared-memory area or different sandbox policy. Fix: pin browser artifacts, use the same container or OS family, install dependencies, set an explicit viewport, and retain screenshots, console logs and browser stderr as CI artifacts.
Headless output differs from headed output
Cause: timing, viewport, font availability, GPU behavior or code that detects visibility. Fix: wait for a specific selector or network state, set the viewport and timezone explicitly, install the same fonts, and reproduce once with headless: false before changing browser flags.
Reliability, performance and cost decisions
- Framework-managed downloads: simplest upgrades and compatible defaults; cache the downloaded browser in CI to reduce setup time.
- Pinned Chrome for Testing: strongest repeatability for WebDriver and regulated test pipelines; you own update scheduling and cache maintenance.
- Headless shell: appropriate for shell-only CI workloads; do not assume it supports every workflow that expects full Chromium.
- Branded Chrome: useful for channel-specific compatibility testing, but local auto-updates can change results unexpectedly.
Keep browser and driver versions in source-controlled configuration, upgrade intentionally, and test the upgrade on each supported OS and architecture. There is no universal download size or speed promise: artifact size and startup behavior depend on framework, release, operating system and cache state.
Or skip the browser setup
If your goal is simply a reliable website screenshot rather than browser test control, ScreenshotNeo makes one request and returns PNG, JPEG, WebP or PDF. It accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; each cleanup step can be disabled. Only clean shots are billed: bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits cost nothing, and response headers report the page verdict and billing status.
It also provides an MCP server for Claude, Cursor and other MCP clients, with take_screenshot, get_page_info and capture_pdf tools. Every plan includes the features, and the Free plan includes 1,000 shots per month without a card.
One-call examples
See the parameter reference in the ScreenshotNeo documentation.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
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)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
Paid plans start at $5 for 3,000 shots; Growth is $15 for 15,000, Pro $39 for 60,000, Scale $99 for 250,000 and Business $249 for 1,000,000. Yearly billing provides two months free. Create a free ScreenshotNeo account with 1,000 screenshots per month and no card.
FAQ
Is Chrome Headless a separate browser?
Current Headless is a mode of regular Chrome. The separate legacy implementation is available as chrome-headless-shell.
Should I install Chrome before installing Puppeteer?
Usually no. Puppeteer downloads a compatible Chrome for Testing. Install a system Chrome only when your project intentionally targets that binary.
Free tools Windows power users keep installed
One-click scans. No signup required.
Can Playwright install Google Chrome?
No. Playwright installs its supported Chromium builds; branded Google Chrome and Microsoft Edge must already be installed.
Do Selenium users always need to download ChromeDriver manually?
No. A supported WebDriver manager can handle it, but the resulting Chrome and driver still need to be compatible. Pin them when repeatability matters.
When is headless-shell-only installation appropriate?
Use it for CI workloads that need only the shell and do not select full Chromium or a branded browser. Otherwise install the browser your framework expects.
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.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →




