microsoft/playwright · error · Error

ERROR: Playwright does not support ${descriptor.name} on ${h

Error message

ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}

What it means

Thrown by _downloadExecutable when _downloadURLs returns an empty array — no download path template exists in DOWNLOAD_PATHS for the host platform (hostPlatform). This means Playwright has no build of the requested browser (chromium, firefox, webkit, ffmpeg, etc.) available to download for the current OS/architecture combination.

Source

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

    let downloadHostEnv;
    if (descriptor.name.startsWith('chromium'))
      downloadHostEnv = 'PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST';
    else if (descriptor.name.startsWith('firefox'))
      downloadHostEnv = 'PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST';
    else if (descriptor.name.startsWith('webkit'))
      downloadHostEnv = 'PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST';

    const customHostOverride = (downloadHostEnv && getFromENV(downloadHostEnv)) || getFromENV('PLAYWRIGHT_DOWNLOAD_HOST');
    if (customHostOverride)
      mirrors = [customHostOverride];

    return mirrors.map(mirror => `${mirror}/${downloadPath}`);
  }

  private async _downloadExecutable(descriptor: BrowsersJSONDescriptor, force: boolean, executablePath?: string) {
    const downloadURLs = this._downloadURLs(descriptor);
    if (!downloadURLs.length)
      throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}`);
    if (!isOfficiallySupportedPlatform)
      logPolitely(`BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ${hostPlatform}.`);
    if (descriptor.hasRevisionOverride) {
      const message = `You are using a frozen ${descriptor.name} browser which does not receive updates anymore on ${hostPlatform}. Please update to the latest version of your operating system to test up-to-date browsers.`;
      if (process.env.GITHUB_ACTIONS)
        console.log(`::warning title=Playwright::${message}`);  // eslint-disable-line no-console
      else
        logPolitely(message);
    }

    const title = this.calculateDownloadTitle(descriptor);
    const downloadFileName = `playwright-download-${descriptor.name}-${hostPlatform}-${descriptor.revision}.zip`;
    // PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT is a misnomer, it actually controls the socket's
    // max idle timeout. Unfortunately, we cannot rename it without breaking existing user workflows.
    const downloadSocketTimeoutEnv = getFromENV('PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT');
    const downloadSocketTimeout = +(downloadSocketTimeoutEnv || '0') || NET_DEFAULT_TIMEOUT;
    await downloadBrowserWithProgressBar(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout, force).catch(e => {
      throw new Error(`Failed to download ${title}, caused by\n${e.stack}`);

View on GitHub (pinned to c8fc3bf8d3)

Solutions

  1. Upgrade Playwright to a version that publishes builds for your platform/arch.
  2. Run on an officially supported platform (see isOfficiallySupportedPlatform).
  3. Use a system-installed browser via channel instead of the hermetic download.
  4. Set PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD and supply a compatible browser manually.
Defensive patterns

Strategy: validation

Validate before calling

// Before scripting an install, confirm the platform has a download path
const supported = ['linux','darwin','win32'].includes(process.platform)
  && ['x64','arm64'].includes(process.arch);
if (!supported) throw new Error(`No Playwright browser build for ${process.platform}/${process.arch}`);

Type guard

function isDownloadSupportedPlatform(): boolean {
  // Mirror Playwright's isOfficiallySupportedPlatform heuristic
  return ['darwin', 'linux', 'win32'].includes(process.platform);
}

Try / catch

try {
  await registry.install(executables);
} catch (e) {
  if (/does not support .* on/.test(e.message)) {
    // fall back: use a system browser via channel, or skip
  } else throw e;
}

Prevention

When it happens

Trigger: Running 'playwright install <browser>' (or triggering _downloadExecutable via npm postinstall) on a platform/arch for which DOWNLOAD_PATHS has no entry and no '<unknown>' fallback — e.g. an unsupported architecture like linux-arm64 on older Playwright, or a niche OS.

Common situations: Building on linux-arm64 / alpine / freebsd where no prebuilt binary is published; running inside an emulated QEMU build; using a frozen Playwright revision whose browsers.json dropped support for the host.

Related errors


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