puppeteer/puppeteer · error · Error
Tried to find the browser at the configured path (${executab
Error message
Tried to find the browser at the configured path (${executablePath}), but no executable was found. What it means
resolveExecutablePath first honors a user-configured executablePath. If validatePath is true and that configured path does not exist on disk, it throws immediately — before falling back to a cached browser. This protects against silently using a wrong binary when the user explicitly set one.
Source
Thrown at packages/puppeteer-core/src/node/BrowserLauncher.ts:566
const config = await this.puppeteer.configuration();
return join(
config.temporaryDirectory ?? tmpdir(),
`puppeteer_dev_${this.browser}_profile-`,
);
}
/**
* @internal
*/
async resolveExecutablePath(
headless?: boolean | 'shell',
validatePath = true,
): Promise<string> {
const config = await this.puppeteer.configuration();
let executablePath = config.executablePath;
if (executablePath) {
if (validatePath && !existsSync(executablePath)) {
throw new Error(
`Tried to find the browser at the configured path (${executablePath}), but no executable was found.`,
);
}
return executablePath;
}
function puppeteerBrowserToInstalledBrowser(
browser?: SupportedBrowser,
headless?: boolean | 'shell',
) {
switch (browser) {
case 'chrome':
if (headless === 'shell') {
return InstalledBrowser.CHROMEHEADLESSSHELL;
}
return InstalledBrowser.CHROME;
case 'firefox':
return InstalledBrowser.FIREFOX;View on GitHub (pinned to d484e21c17)
Solutions
- Correct or remove the executablePath entry in your Puppeteer config / env so Puppeteer can resolve the cached browser.
- Re-install the browser to the configured location.
- Pass validatePath=false only if you intentionally resolve without checking (advanced).
- Verify the path with fs.existsSync before relying on it in scripts/CI.
Example fix
// before (puppeteer.config.cjs)
module.exports = { executablePath: '/old/path/chrome' };
// after
module.exports = {}; // let Puppeteer resolve the cached Chrome
// or point to a verified path
module.exports = { executablePath: '/usr/bin/google-chrome' }; Defensive patterns
Strategy: validation
Validate before calling
import fs from 'node:fs';
function resolveConfiguredExe(path?: string, validate = true) {
if (path && validate && !fs.existsSync(path)) {
throw new Error(`Configured executablePath does not exist: ${path}`);
}
return path;
} Type guard
const executableExists = (p?: string): boolean => !p || (fs.existsSync(p));
Try / catch
try {
await puppeteer.launch(); // uses configured executablePath
} catch (e) {
if (e instanceof Error && e.message.startsWith('Tried to find the browser at the configured path')) {
// remove the stale executablePath from config and let it resolve from cache
} else throw e;
} Prevention
- Keep executablePath out of shared/version-controlled config unless it's a stable path.
- Verify the path with fs.existsSync in startup checks.
- Re-run the browser install if the binary was moved.
When it happens
Trigger: Setting executablePath in puppeteer.config / configuration() (or via the PUPPETEER_EXECUTABLE_PATH env-derived config) to a path that doesn't exist; calling resolveExecutablePath after the binary was moved/deleted.
Common situations: Config file committed with a developer's local path; container path differs from the dev machine; browser uninstalled/upgraded and the old path is stale; typo in the config path.
Related errors
- Browser was not found at the configured executablePath (${la
- Unable to retrieve file at ${path}.
- Tried to find the browser at the configured path (${executab
- Could not find ${getBrowserTypeDisplayName(browserType)} (ve
- Unknown product: ${browser}
AI-assisted analysis of puppeteer/puppeteer@d484e21c17 (2026-08-12).
Data as JSON: /api/errors/8fe62429719fc806.
Report an issue: GitHub.