{"record":{"id":"916c4dcb275f3358","repo":"microsoft/playwright","slug":"failed-to-download-title-caused-by-e-stack","errorCode":null,"errorMessage":"Failed to download ${title}, caused by\n${e.stack}","messagePattern":"Failed to download (.+?), caused by\n(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/registry/index.ts","lineNumber":1118,"sourceCode":"      throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}`);\n    if (!isOfficiallySupportedPlatform)\n      logPolitely(`BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ${hostPlatform}.`);\n    if (descriptor.hasRevisionOverride) {\n      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.`;\n      if (process.env.GITHUB_ACTIONS)\n        console.log(`::warning title=Playwright::${message}`);  // eslint-disable-line no-console\n      else\n        logPolitely(message);\n    }\n\n    const title = this.calculateDownloadTitle(descriptor);\n    const downloadFileName = `playwright-download-${descriptor.name}-${hostPlatform}-${descriptor.revision}.zip`;\n    // PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT is a misnomer, it actually controls the socket's\n    // max idle timeout. Unfortunately, we cannot rename it without breaking existing user workflows.\n    const downloadSocketTimeoutEnv = getFromENV('PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT');\n    const downloadSocketTimeout = +(downloadSocketTimeoutEnv || '0') || NET_DEFAULT_TIMEOUT;\n    await downloadBrowserWithProgressBar(title, descriptor.dir, executablePath, downloadURLs, downloadFileName, downloadSocketTimeout, force).catch(e => {\n      throw new Error(`Failed to download ${title}, caused by\\n${e.stack}`);\n    });\n  }\n\n  calculateDownloadTitle(descriptor: BrowsersJSONDescriptor | Executable) {\n    const title = descriptor.title ?? descriptor.name.split('-').map(word => {\n      return word === 'ffmpeg' ? 'FFmpeg' : word.charAt(0).toUpperCase() + word.slice(1);\n    }).join(' ');\n    const version = descriptor.browserVersion ? ' ' + descriptor.browserVersion : '';\n    return `${title}${version} (playwright ${descriptor.name} v${descriptor.revision})`;\n  }\n\n  private async _installMSEdgeChannel(channel: 'msedge'|'msedge-beta'|'msedge-dev', scripts: Record<'linux' | 'darwin' | 'win32', string>) {\n    const scriptArgs: string[] = [];\n    if (process.platform !== 'linux') {\n      const products = lowercaseAllKeys(JSON.parse(await fetchData(undefined, { url: 'https://edgeupdates.microsoft.com/api/products' })));\n\n      const productName = {\n        'msedge': 'Stable',","sourceCodeStart":1100,"sourceCodeEnd":1136,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/registry/index.ts#L1100-L1136","documentation":"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).","triggerScenarios":"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.","commonSituations":"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.","solutions":["Re-run the install — transient network errors often clear.","Set PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT to a larger value (milliseconds) for slow links.","Verify proxy/firewall allows the Playwright CDN hosts; configure HTTPS_PROXY if egress requires it.","Point PLAYWRIGHT_DOWNLOAD_HOST (or the per-browser variant) at an accessible internal mirror.","Free disk space and remove a partially-written browser directory before retrying."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Validate reachability of the CDN before installing (best-effort)\nimport { lookup } from 'dns/promises';\ntry {\n  await lookup('playwright.azureedge.net');\n} catch {\n  console.warn('CDN not resolvable; check DNS/proxy before installing browsers');\n}","typeGuard":null,"tryCatchPattern":"async function installWithRetry(executables, retries = 3) {\n  for (let i = 0; i < retries; i++) {\n    try { return await registry.install(executables); }\n    catch (e) {\n      if (/Failed to download/.test(e.message) && i < retries - 1) continue;\n      throw e;\n    }\n  }\n}","preventionTips":["Configure HTTPS_PROXY for environments behind a corporate proxy.","Increase PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT for slow links.","Point PLAYWRIGHT_DOWNLOAD_HOST at a reachable internal mirror.","Ensure adequate free disk space before installing."],"tags":["download","network","timeout","registry","cdn"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}