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
- Install the requested browser at its standard location (e.g. install Chrome/Edge system-wide).
- Switch to a channel that is installed, or to the bundled `chromium` (`npx playwright install chromium`).
- 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
- Install the requested browser at its standard location.
- Fall back to the bundled chromium if no system browser is available.
- Pass --executable-path when the binary lives in a non-standard location.
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
- Unsupported channel: "${this._browserChannel}"
- Executable doesn't exist at ${e} ${wrapInASCIIBox(prettyMess
- ERROR: Playwright does not support installing ${executable.n
- ${label} is not installed${location}. Run `${command}` to in
- Failed to create tab
AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12).
Data as JSON: /api/errors/6e7464687a1d2e98.
Report an issue: GitHub.