microsoft/playwright · error · Error

Chromium distribution '${name}' is not supported on ${proces

Error message

Chromium distribution '${name}' is not supported on ${process.platform}

What it means

Thrown by the executable-path resolver inside _createChromiumChannel when a system-installed Chromium-channel browser (e.g. 'chrome', 'chrome-beta', 'msedge') is requested on a platform for which no lookup path was registered. The lookAt map keyed by 'linux'|'darwin'|'win32' returns a falsy suffix for process.platform, so Playwright has no known location to probe. It surfaces via executablePathOrDie, which ChromiumType.launch calls when channel is set and the bundled chromium is not used.

Source

Thrown at packages/playwright-core/src/server/registry/index.ts:819

      executablePath: () => undefined,
      executablePathOrDie: () => '',
      installType: 'download-on-demand',
      _validateHostRequirements: () => Promise.resolve(),
      downloadURLs: this._downloadURLs(android),
      title: android.title,
      revision: android.revision,
      _install: force => this._downloadExecutable(android, force),
      _dependencyGroup: 'tools',
      _isHermeticInstallation: true,
    });
  }

  private _createChromiumChannel(name: string, lookAt: Record<'linux' | 'darwin' | 'win32', string>, install?: () => Promise<void>): ExecutableImpl {
    const executablePath = (sdkLanguage: string, shouldThrow: boolean) => {
      const suffix = lookAt[process.platform as 'linux' | 'darwin' | 'win32'];
      if (!suffix) {
        if (shouldThrow)
          throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`);
        return undefined;
      }
      const prefixes = (process.platform === 'win32' ? [
        process.env.LOCALAPPDATA,
        process.env.PROGRAMFILES,
        process.env['PROGRAMFILES(X86)'],
        // In some cases there is no PROGRAMFILES/(86) env var set but HOMEDRIVE is set.
        process.env.HOMEDRIVE + '\\Program Files',
        process.env.HOMEDRIVE + '\\Program Files (x86)',
      ].filter(Boolean) : ['']) as string[];

      for (const prefix of prefixes) {
        const executablePath = path.join(prefix, suffix);
        if (canAccessFile(executablePath))
          return executablePath;
      }
      if (!shouldThrow)
        return undefined;

View on GitHub (pinned to c8fc3bf8d3)

Solutions

  1. Omit the channel option so Playwright falls back to the hermetically-installed bundled chromium.
  2. Run 'npx playwright install <channel>' on the target OS to register and install the channel before launching.
  3. Gate the channel value on process.platform in your launch config so an unsupported platform uses bundled chromium instead.
  4. Upgrade Playwright — newer versions add platform paths for additional channels.

Example fix

// before
const browser = await chromium.launch({ channel: 'chrome' });

// after
const browser = await chromium.launch({
  channel: ['win32','darwin'].includes(process.platform) ? 'chrome' : undefined,
});
Defensive patterns

Strategy: validation

Validate before calling

import { registry } from 'playwright-core/lib/server/registry';

const channel = 'chrome';
const exec = registry.findExecutable(channel);
// Non-throwing probe: returns undefined instead of throwing
const path = exec?.executablePath();
if (!path) {
  // fall back to bundled chromium — do not call executablePathOrDie
}

Type guard

function isChannelSupportedOnPlatform(channel: string): boolean {
  const exec = registry.findExecutable(channel);
  if (!exec) return false;
  try { exec.executablePath(); return true; } catch { return false; }
}

Try / catch

try {
  browser = await chromium.launch({ channel });
} catch (e) {
  if (/not supported on/.test(e.message))
    browser = await chromium.launch(); // bundled fallback
  else throw e;
}

Prevention

When it happens

Trigger: Calling chromium.launch({ channel: 'chrome' }) (or 'chrome-beta','msedge','msedge-beta','msedge-dev') on an OS where that channel's lookAt entry is undefined or empty; or invoking executablePathOrDie on the registry Executable for that channel. The error fires only in the shouldThrow=true branch (executablePathOrDie), not in the non-throwing executablePath() probe.

Common situations: Running a CI matrix that sets a fixed channel name but executes on an OS that does not ship that channel; using a Playwright version that predates a channel's platform support; assuming 'chrome' is resolvable on a minimal Linux container that only has the bundled chromium.

Related errors


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