microsoft/playwright · error · Error

Failed to download ${title}, caused by ${e.stack}

Error message

Failed to download ${title}, caused by
${e.stack}

What it means

Thrown by _downloadExecutable when downloadBrowserWithProgressBar rejects — the actual download of the browser zip failed. The wrapped error includes the human-readable download title and the full stack of the underlying cause (network refusal, socket timeout, HTTP error, interrupted/corrupt zip, disk write failure).

Source

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

      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}`);
    });
  }

  calculateDownloadTitle(descriptor: BrowsersJSONDescriptor | Executable) {
    const title = descriptor.title ?? descriptor.name.split('-').map(word => {
      return word === 'ffmpeg' ? 'FFmpeg' : word.charAt(0).toUpperCase() + word.slice(1);
    }).join(' ');
    const version = descriptor.browserVersion ? ' ' + descriptor.browserVersion : '';
    return `${title}${version} (playwright ${descriptor.name} v${descriptor.revision})`;
  }

  private async _installMSEdgeChannel(channel: 'msedge'|'msedge-beta'|'msedge-dev', scripts: Record<'linux' | 'darwin' | 'win32', string>) {
    const scriptArgs: string[] = [];
    if (process.platform !== 'linux') {
      const products = lowercaseAllKeys(JSON.parse(await fetchData(undefined, { url: 'https://edgeupdates.microsoft.com/api/products' })));

      const productName = {
        'msedge': 'Stable',

View on GitHub (pinned to c8fc3bf8d3)

Solutions

  1. Re-run the install — transient network errors often clear.
  2. Set PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT to a larger value (milliseconds) for slow links.
  3. Verify proxy/firewall allows the Playwright CDN hosts; configure HTTPS_PROXY if egress requires it.
  4. Point PLAYWRIGHT_DOWNLOAD_HOST (or the per-browser variant) at an accessible internal mirror.
  5. Free disk space and remove a partially-written browser directory before retrying.
Defensive patterns

Strategy: retry

Validate before calling

// Validate reachability of the CDN before installing (best-effort)
import { lookup } from 'dns/promises';
try {
  await lookup('playwright.azureedge.net');
} catch {
  console.warn('CDN not resolvable; check DNS/proxy before installing browsers');
}

Try / catch

async function installWithRetry(executables, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try { return await registry.install(executables); }
    catch (e) {
      if (/Failed to download/.test(e.message) && i < retries - 1) continue;
      throw e;
    }
  }
}

Prevention

When it happens

Trigger: Any failure inside downloadBrowserWithProgressBar: connection refused/reset, socket idle timeout exceeded (governed by PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT / NET_DEFAULT_TIMEOUT), HTTP 4xx/5xx from the CDN, partial download that fails integrity, or ENOSPC while writing the zip.

Common situations: Corporate proxy or firewall blocking the CDN; flaky CI network; rate-limited or geo-blocked CDN endpoint; full disk; PLAYWRIGHT_DOWNLOAD_HOST misconfigured to an unreachable mirror.

Related errors


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