{"record":{"id":"7673211117f4af6d","repo":"microsoft/playwright","slug":"error-playwright-does-not-support-descriptor-na","errorCode":null,"errorMessage":"ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}","messagePattern":"ERROR: Playwright does not support (.+?) on (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/registry/index.ts","lineNumber":1100,"sourceCode":"    let downloadHostEnv;\n    if (descriptor.name.startsWith('chromium'))\n      downloadHostEnv = 'PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST';\n    else if (descriptor.name.startsWith('firefox'))\n      downloadHostEnv = 'PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST';\n    else if (descriptor.name.startsWith('webkit'))\n      downloadHostEnv = 'PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST';\n\n    const customHostOverride = (downloadHostEnv && getFromENV(downloadHostEnv)) || getFromENV('PLAYWRIGHT_DOWNLOAD_HOST');\n    if (customHostOverride)\n      mirrors = [customHostOverride];\n\n    return mirrors.map(mirror => `${mirror}/${downloadPath}`);\n  }\n\n  private async _downloadExecutable(descriptor: BrowsersJSONDescriptor, force: boolean, executablePath?: string) {\n    const downloadURLs = this._downloadURLs(descriptor);\n    if (!downloadURLs.length)\n      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}`);","sourceCodeStart":1082,"sourceCodeEnd":1118,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/registry/index.ts#L1082-L1118","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Upgrade Playwright to a version that publishes builds for your platform/arch.","Run on an officially supported platform (see isOfficiallySupportedPlatform).","Use a system-installed browser via channel instead of the hermetic download.","Set PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD and supply a compatible browser manually."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before scripting an install, confirm the platform has a download path\nconst supported = ['linux','darwin','win32'].includes(process.platform)\n  && ['x64','arm64'].includes(process.arch);\nif (!supported) throw new Error(`No Playwright browser build for ${process.platform}/${process.arch}`);","typeGuard":"function isDownloadSupportedPlatform(): boolean {\n  // Mirror Playwright's isOfficiallySupportedPlatform heuristic\n  return ['darwin', 'linux', 'win32'].includes(process.platform);\n}","tryCatchPattern":"try {\n  await registry.install(executables);\n} catch (e) {\n  if (/does not support .* on/.test(e.message)) {\n    // fall back: use a system browser via channel, or skip\n  } else throw e;\n}","preventionTips":["Run installs on officially supported OS/arch combinations.","Upgrade Playwright to pick up newly published platform builds.","Set PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD on unsupported archs and supply a compatible browser manually."],"tags":["download","platform","architecture","registry","unsupported"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}