Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
If Puppeteer reports Could not find Chrome (ver. ...), first determine whether Chrome was never downloaded or whether Puppeteer is looking in a different cache or runtime environment. With the standard puppeteer package, run npx puppeteer browsers install (or the equivalent command for your package manager), then verify the cache and launch configuration. If you use puppeteer-core or manage Chrome yourself, provide executablePath or channel. A browser that is found but immediately exits is a separate Linux dependency, sandbox, or policy problem.
Start with the error’s meaning
Puppeteer has two distinct failure stages:
- Discovery failure: Puppeteer cannot locate the browser revision it expects. This produces the familiar
Could not find Chrome (ver. ...)message. - Launch failure: Puppeteer locates an executable, but Chrome exits, cannot load a shared library, or is blocked by the operating system.
Use the discovery fixes below until Puppeteer can identify a browser. Only then investigate Linux libraries, sandboxing, AppArmor, or other launch restrictions. Mixing the two branches often leads to unsafe or ineffective fixes such as adding --no-sandbox when no browser exists.
The commands and package-manager behavior below come from the current Puppeteer installation guide and troubleshooting guide. Both are /next/ documentation, so confirm syntax against the version installed in your project.
1. Check which Puppeteer package you installed
puppeteer (the browser-downloading package)
The normal puppeteer package includes an installation step that downloads a compatible browser. If your package manager blocks dependency install scripts, npm can finish installing the JavaScript package while skipping that browser download. The result is an apparently successful install followed by Could not find Chrome (ver. ...) at runtime.
#1 Best Overall
puppeteer-core (the browser-managed-by-you package)
puppeteer-core does not download Chrome. It is intended for a browser you install separately, a remote browser connection, or an environment that supplies its own binary. In that model, the error is expected until your launch code identifies the executable.
Check your dependency tree and the import in the failing program. A project can also contain both packages; make sure the package whose API you call is the one whose installation and configuration you are troubleshooting.
2. Download the browser manually
If the post-install script was skipped, use Puppeteer’s browser installer from the project directory:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
npx puppeteer browsers install
Equivalent commands documented for other package managers are:
yarn dlx puppeteer browsers install
pnpm dlx puppeteer browsers install
bun x puppeteer browsers install
Run the command as the same user and in the same environment that will execute your application. In CI or a container, installing on your workstation does not place the browser in the build image or deployment runtime.
Rank #2
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
Allowing install scripts
An alternative is to configure your package manager to permit Puppeteer’s install script, then reinstall dependencies. The current installation guide shows an allowScripts example for npm. Treat that as package-manager- and version-specific configuration, not a universal setting: consult the policy mechanism for your exact npm, pnpm, Yarn, Bun, or Deno setup. After changing the policy, remove and reinstall dependencies or run the documented browser-install command so the skipped download actually occurs.
3. Verify the cache and the runtime identity
Puppeteer’s troubleshooting guide says that, starting with Puppeteer v19.0.0, the default browser cache is ~/.cache/puppeteer, derived from the user home directory. The browser can therefore be present but invisible to your script when installation and execution use different users, home directories, containers, or build stages.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Compare installation and execution contexts
- Check the operating-system user that ran dependency installation and the user running the application.
- Compare
HOME(or the platform’s home-directory equivalent) in both contexts. - Check whether a container build downloaded the browser into an earlier layer that is not present in the final image.
- Confirm that a CI cache was restored to the same path expected by the runtime.
Do not assume that a browser visible in one shell is available to a service, worker, Docker stage, or serverless runtime launched with a different identity.
Set an explicit cache directory
You can configure the location with PUPPETEER_CACHE_DIR or a Puppeteer configuration file. For example, set the environment variable consistently in both the installation and execution environments:
export PUPPETEER_CACHE_DIR=/opt/puppeteer-cache
npx puppeteer browsers install
Alternatively, use a .puppeteerrc.js or puppeteer.config.js file with a cacheDirectory setting. The troubleshooting guide notes that you should reinstall Puppeteer after changing the configuration-file cache directory so the new setting is applied to the downloaded browser. Ensure the chosen directory is readable and executable by the runtime user.
Rank #3
4. Configure a separately managed Chrome
For puppeteer-core, a remote browser, or a deliberately system-managed installation, pass the browser location explicitly. Puppeteer’s installation documentation states that browser managers should use executablePath, or channel when the browser is installed in a standard location.
Free tools Windows power users keep installed
One-click scans. No signup required.
Explicit executable path
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/absolute/path/to/chrome'
});
const page = await browser.newPage();
await page.goto('https://example.com', {waitUntil: 'networkidle2'});
console.log(await page.title());
await browser.close();
})();
Replace the example with a real path in the same environment as the Node process. Check that the file exists, is executable, and is compatible with the operating system and architecture. A path valid on a developer laptop is not automatically valid in a Linux container or CI runner.
Standard browser channel
const puppeteer = require('puppeteer-core');
const browser = await puppeteer.launch({ channel: 'chrome' });
Use channel only when the corresponding browser is installed where Puppeteer can find it. If discovery remains ambiguous, use an absolute executablePath.
5. Diagnose Linux launch failures separately
Once Puppeteer has a valid path, a different error may report that Chrome cannot start. On Linux, missing shared libraries are a common cause. The official troubleshooting guide recommends checking the binary’s dependencies with:
ldd chrome | grep not
Run this against the actual Chrome executable (use its full path if it is not in the current directory). Any line marked not found identifies a missing shared library. Install the dependency using the package names for your distribution and release; the Debian and CentOS examples in the guide are not a timeless list for every image.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Rank #4
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
Sandbox and security policy
Linux sandbox restrictions and AppArmor rules can also prevent a located browser from launching. The troubleshooting guide discusses AppArmor behavior on Ubuntu 23.10 and later and other platform-specific cases. Inspect the exact launch error, distribution policy, and service permissions before changing security settings. Puppeteer strongly discourages running Chrome with --no-sandbox; preserve sandboxing and fix the underlying permission or policy issue whenever possible.
A repeatable repair workflow
- Record the exact error, Puppeteer version, package manager, operating system, and execution environment.
- Confirm whether the dependency is
puppeteerorpuppeteer-core. - For
puppeteer, run the appropriatepuppeteer browsers installcommand or enable the install script and reinstall. - Compare the install-time and run-time user, home directory, cache variable, container stage, and CI cache.
- If the browser is externally managed, set
executablePathor a validchannel; do not wait forpuppeteer-coreto download it. - Run a minimal launch script. If the message is still “could not find Chrome,” continue with installation and path checks; if Chrome is found but exits, switch to operating-system diagnostics.
- On Linux, inspect shared libraries and security-policy errors before considering any launch flag.
Common symptoms, causes, and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
Could not find Chrome (ver. ...) immediately after install |
Install script was blocked or browser download failed | Run npx puppeteer browsers install; review package-manager script policy |
| Works locally, fails in CI | Different user, home directory, cache, image layer, or architecture | Install in CI/container and align PUPPETEER_CACHE_DIR and permissions |
puppeteer-core cannot launch |
No browser is supplied automatically | Install/manage Chrome and pass executablePath or channel |
| Executable path is found, then process exits on Linux | Missing shared library or security restriction | Use ldd ... | grep not; inspect sandbox and AppArmor errors |
| Changing cache configuration has no effect | Browser was downloaded under the old configuration | Reinstall Puppeteer after changing the configuration-file cache directory |
Performance, reliability, and deployment notes
Install once per image or build
Downloading the browser during an image build or CI setup avoids a first-request race and makes the runtime deterministic. Keep the browser files in the final image or restore the cache before starting workers.
Keep paths and permissions explicit
Use one documented cache directory, make it readable and executable by the service account, and avoid relying on an interactive shell’s environment. If multiple processes run under different users, give each a deliberate shared cache or install a browser separately for each account.
Pin the environment you actually deploy
Puppeteer’s managed browser is selected for compatibility with the installed package. With a system Chrome, upgrades can change the executable path or browser behavior; test the exact OS image, architecture, Puppeteer version, and browser channel used in production.
Or skip the browser setup
If your goal is simply to obtain a reliable website image or PDF rather than maintain a browser runtime, ScreenshotNeo provides a GET-based screenshot API and an MCP server for AI clients. A single request can return PNG, JPEG, WebP, or PDF. The API accepts options for full-page captures with lazy images, CSS-selector elements, device presets and custom viewports, retina scale, dark mode, PDF paper and page ranges, custom CSS or JavaScript, clicks, waits, hidden selectors, blocked requests, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, TTL caching, signed links, asynchronous webhooks, bulk capture, and usage reporting.
Best Value
Cookie and consent banners, newsletter popups, and chat widgets are removed before the shot. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status with X-Page-Verdict and X-Billed headers. ScreenshotNeo also offers take_screenshot, get_page_info, and capture_pdf through MCP for Claude, Cursor, and other MCP clients.
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 parameters and response handling. The same request in Python and Node.js:
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}`);
The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots; every feature is available on every plan, and yearly billing provides two months free. Create a free ScreenshotNeo account to get started.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsFrequently Asked Questions
Should I install Chrome separately when using the regular puppeteer package?
Usually no. The regular package downloads a compatible browser during installation; install it manually only when the package-manager script was skipped or the download failed.
Can I fix a missing browser by adding –no-sandbox?
No. That flag addresses a sandbox launch restriction, not a browser that Puppeteer cannot find, and the Puppeteer guide strongly discourages disabling the sandbox.
Why does the error appear only in production?
Production may use a different user, HOME directory, cache path, container stage, architecture, or package-install policy. Compare those values and install the browser in the deployed environment.
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.

