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

  1. Correct or remove the executablePath entry in your Puppeteer config / env so Puppeteer can resolve the cached browser.
  2. Re-install the browser to the configured location.
  3. Pass validatePath=false only if you intentionally resolve without checking (advanced).
  4. 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

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


AI-assisted analysis of puppeteer/puppeteer@d484e21c17 (2026-08-12). Data as JSON: /api/errors/8fe62429719fc806. Report an issue: GitHub.