{"record":{"id":"cb1d8c918b99accd","repo":"microsoft/playwright","slug":"error-playwright-does-not-support-installing-ex","errorCode":null,"errorMessage":"ERROR: Playwright does not support installing ${executable.name}","messagePattern":"ERROR: Playwright does not support installing (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/registry/index.ts","lineNumber":966,"sourceCode":"          factor: 1.27579,\n        },\n        onCompromised: (err: Error) => {\n          throw new Error(`${err.message} Path: ${lockfilePath}`);\n        },\n        lockfilePath,\n      });\n      // Create a link first, so that cache validation does not remove our own browsers.\n      await fs.promises.mkdir(linksDir, { recursive: true });\n      await fs.promises.writeFile(path.join(linksDir, calculateSha1(PACKAGE_PATH)), PACKAGE_PATH);\n\n      // Remove stale browsers.\n      if (options?.gc !== false && !getAsBooleanFromENV('PLAYWRIGHT_SKIP_BROWSER_GC'))\n        await this._validateInstallationCache(linksDir);\n\n      // Install browsers for this package.\n      for (const executable of executables) {\n        if (!executable._install)\n          throw new Error(`ERROR: Playwright does not support installing ${executable.name}`);\n\n        if (!getAsBooleanFromENV('CI') && !executable._isHermeticInstallation && !options?.force && executable.executablePath()) {\n          const { embedderName } = getEmbedderName();\n          const command = buildPlaywrightCLICommand(embedderName, 'install --force ' + executable.name);\n          // eslint-disable-next-line no-restricted-properties\n          process.stderr.write('\\n' + wrapInASCIIBox([\n            `ATTENTION: \"${executable.name}\" is already installed on the system!`,\n            ``,\n            `\"${executable.name}\" installation is not hermetic; installing newer version`,\n            `requires *removal* of a current installation first.`,\n            ``,\n            `To *uninstall* current version and re-install latest \"${executable.name}\":`,\n            ``,\n            `- Close all running instances of \"${executable.name}\", if any`,\n            `- Use \"--force\" to install browser:`,\n            ``,\n            `    ${command}`,\n            ``,","sourceCodeStart":948,"sourceCodeEnd":984,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/registry/index.ts#L948-L984","documentation":"Thrown inside Registry.install when iterating the requested executables and finding one whose _install function is undefined — meaning Playwright has no installation mechanism for that executable. This guards against attempting to install tools or channels that are detection-only (installType 'none') or platform helpers like 'winldd'.","triggerScenarios":"Calling registry.install() (directly or via 'playwright install <name>') with an Executable whose _install is null — e.g. 'winldd', a system-detected channel with no install script, or any executable the current Playwright build marks as not installable.","commonSituations":"Passing a custom or deprecated executable name to the install CLI; a bug in calling code that forwards a non-installable Executable to install(); upgrading Playwright where a previously-installable item lost its _install handler.","solutions":["Run 'npx playwright install' with no arguments (or 'chromium'/'firefox'/'webkit') to install only supported targets.","Check the executable name against registry.executables() and filter out entries with installType 'none' before calling install.","Upgrade or align Playwright so the desired executable ships an _install handler."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { registry } from 'playwright-core/lib/server/registry';\n\nconst names = process.argv.slice(2); // install targets\nconst installable = names.filter(n => {\n  const e = registry.findExecutable(n);\n  return e && e.installType !== 'none';\n});\nif (installable.length !== names.length)\n  throw new Error('Some targets are not installable: ' + names.filter(n => !installable.includes(n)).join(', '));","typeGuard":"function isInstallable(name: string): boolean {\n  const e = registry.findExecutable(name);\n  return !!e && e.installType !== 'none' && typeof (e as any)._install === 'function';\n}","tryCatchPattern":null,"preventionTips":["Filter executables to those with installType !== 'none' before calling registry.install.","Use suggestedBrowsersToInstall() to discover valid install targets.","Prefer the default 'playwright install' invocation over passing exotic names."],"tags":["install","executable","registry","validation"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}