microsoft/playwright · critical · Error

"${this._browserChannel}" executable not found. Make sure it

Error message

"${this._browserChannel}" executable not found. Make sure it is installed at a standard location.

What it means

Thrown by CdpRelay when `registry.findExecutable(channel)` returns an entry but `executableInfo.executablePath()` is falsy — the channel is known but no installed binary maps to it on this machine. Distinct from 475 (unknown channel): here the channel is recognized, just not installed at a standard location.

Source

Thrown at packages/playwright-core/src/tools/mcp/cdpRelay.ts:157

      // Not used anymore.
      version: undefined,
    };
    url.searchParams.set('client', JSON.stringify(client));
    url.searchParams.set('protocolVersion', this._protocolVersion.toString());
    const token = process.env.PLAYWRIGHT_MCP_EXTENSION_TOKEN;
    if (token)
      url.searchParams.set('token', token);
    const href = url.toString();

    const channel = registry.isChromiumAlias(this._browserChannel) ? 'chromium' : this._browserChannel;
    let executablePath = this._executablePath;
    if (!executablePath) {
      const executableInfo = registry.findExecutable(channel);
      if (!executableInfo)
        throw new Error(`Unsupported channel: "${this._browserChannel}"`);
      executablePath = executableInfo.executablePath();
      if (!executablePath)
        throw new Error(`"${this._browserChannel}" executable not found. Make sure it is installed at a standard location.`);
    }

    const args: string[] = [];
    // The default profile dir is not passed explicitly, the browser resolves it on its own.
    if (this._customUserDataDir)
      args.push(`--user-data-dir=${this._customUserDataDir}`);
    if (this._profileDirectory)
      args.push(`--profile-directory=${this._profileDirectory}`);
    if (os.platform() === 'linux' && channel === 'chromium')
      args.push('--no-sandbox');
    args.push(href);
    spawn(executablePath, args, {
      windowsHide: true,
      detached: true,
      shell: false,
      stdio: 'ignore',
    });
  }

View on GitHub (pinned to c8fc3bf8d3)

Solutions

  1. Install the requested browser at its standard location (e.g. install Chrome/Edge system-wide).
  2. Switch to a channel that is installed, or to the bundled `chromium` (`npx playwright install chromium`).
  3. Pass `--executable-path` pointing at wherever the browser binary actually lives.

Example fix

# before
playwright mcp --extension --browser msedge   # Edge not installed
# after
playwright mcp --extension --browser chrome   # Chrome installed
# or
playwright mcp --extension --executable-path /usr/bin/google-chrome
Defensive patterns

Strategy: validation

Validate before calling

import * as registry from '@tools/mcp/registry';
function assertExecutableAvailable(channel: string) {
  const info = registry.findExecutable(channel);
  if (!info || !info.executablePath())
    throw new Error(`No installed executable for ${channel}; install it or pass --executable-path.`);
}

Prevention

When it happens

Trigger: Selecting a registered channel (e.g. `msedge`, `chrome`) that is not installed on the host, while not passing `--executable-path`. `findExecutable` resolves the registry entry but `executablePath()` returns empty because the binary isn't present at the expected standard path.

Common situations: Selecting `--browser msedge` on a machine without Edge; `--browser chrome` without Chrome installed; a fresh CI box where only the bundled Chromium is installed but a system channel was requested.

Related errors


AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12). Data as JSON: /api/errors/6e7464687a1d2e98. Report an issue: GitHub.