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
- 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.
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
- 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.
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
- Timeout ${options.timeout}ms exceeded
- Timeout ${params.timeout}ms exceeded
- ERROR: Playwright does not support ${descriptor.name} on ${h
- Malformed endpoint. Did you use BrowserType.launchServer met
- Socks4 proxy protocol does not support authentication
AI-assisted analysis of microsoft/playwright@c8fc3bf8d3 (2026-08-12).
Data as JSON: /api/errors/916c4dcb275f3358.
Report an issue: GitHub.