Skip to content

在网络受限环境下为 Playwright 高效安装浏览器依赖

Playwright 在初始化安装时,需要从其官方 CDN 下载 Chromium、Firefox、WebKit 等浏览器内核依赖。然而,在特定网络环境(如企业内网、CI/CD 环境或受网络策略限制的地区),直接访问 cdn.playwright.dev 可能会遇到连接超时或下载速度缓慢的问题,导致安装失败。本文提供一种稳定、高效的解决方案,通过预先下载依赖、本地托管并指定安装源的方式,绕过网络限制,确保 Playwright 环境的顺利搭建。

核心原理

Playwright 提供了灵活的环境变量配置,允许用户覆盖默认的浏览器下载源。我们将利用 PLAYWRIGHT_DOWNLOAD_HOST 这一关键环境变量,将下载请求重定向至一个本地或内部网络中的 HTTP 服务器,从而实现离线安装。

操作步骤

第一步:确定依赖版本与下载地址

Playwright 安装器期望的依赖文件路径和版本是固定的,与你所安装的 playwright 库版本直接相关。为了获取精确的下载列表,请使用 --dry-run 标志,它会列出所有需要下载的 URL 而不执行实际下载。

shell
# 对于 Node.js 项目
npx playwright install --dry-run

# 对于 Python 项目
python -m playwright install --dry-run

执行后,你将看到类似以下的输出,这些就是你需要预先下载的文件的确切 URL:

text
# --- macOS (arm64) 示例 ---
# Playwright 版本:Version 1.55.0
browser: chromium version 140.0.7339.16
  Install location:    /Users/adamzhou/Library/Caches/ms-playwright/chromium-1187
  Download url:        https://cdn.playwright.dev/dbazure/download/playwright/builds/chromium/1187/chromium-mac-arm64.zip
  Download fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/chromium/1187/chromium-mac-arm64.zip
  Download fallback 2: https://cdn.playwright.dev/builds/chromium/1187/chromium-mac-arm64.zip

browser: chromium-headless-shell version 140.0.7339.16
  Install location:    /Users/adamzhou/Library/Caches/ms-playwright/chromium_headless_shell-1187
  Download url:        https://cdn.playwright.dev/dbazure/download/playwright/builds/chromium/1187/chromium-headless-shell-mac-arm64.zip
  Download fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/chromium/1187/chromium-headless-shell-mac-arm64.zip
  Download fallback 2: https://cdn.playwright.dev/builds/chromium/1187/chromium-headless-shell-mac-arm64.zip

browser: firefox version 141.0
  Install location:    /Users/adamzhou/Library/Caches/ms-playwright/firefox-1490
  Download url:        https://cdn.playwright.dev/dbazure/download/playwright/builds/firefox/1490/firefox-mac-arm64.zip
  Download fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/firefox/1490/firefox-mac-arm64.zip
  Download fallback 2: https://cdn.playwright.dev/builds/firefox/1490/firefox-mac-arm64.zip

browser: webkit version 26.0
  Install location:    /Users/adamzhou/Library/Caches/ms-playwright/webkit-2203
  Download url:        https://cdn.playwright.dev/dbazure/download/playwright/builds/webkit/2203/webkit-mac-15-arm64.zip
  Download fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/webkit/2203/webkit-mac-15-arm64.zip
  Download fallback 2: https://cdn.playwright.dev/builds/webkit/2203/webkit-mac-15-arm64.zip

browser: ffmpeg
  Install location:    /Users/adamzhou/Library/Caches/ms-playwright/ffmpeg-1011
  Download url:        https://cdn.playwright.dev/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-mac-arm64.zip
  Download fallback 1: https://playwright.download.prss.microsoft.com/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-mac-arm64.zip
  Download fallback 2: https://cdn.playwright.dev/builds/ffmpeg/1011/ffmpeg-mac-arm64.zip

第二步:创建目录结构并下载依赖文件

根据上一步获取的 URL 路径信息,在本地创建完全一致的目录结构。这是确保 Playwright 安装器能够正确定位到文件的关键。

shell
# --- macOS (arm64) 示例 ---
# 创建一个基础目录用于存放所有依赖
INSTALL_BASE_DIR="/path/to/playwright-deps"
mkdir -p "${INSTALL_BASE_DIR}"
cd "${INSTALL_BASE_DIR}"

# 根据 --dry-run 输出的路径创建子目录
mkdir -p builds/chromium/1187
mkdir -p builds/firefox/1490
mkdir -p builds/webkit/2203
mkdir -p builds/ffmpeg/1011

接下来,使用 wget 或其他下载工具,将文件下载到对应的目录中。请注意,目标文件名也必须与 URL 中的文件名保持一致。

shell
# --- macOS (arm64) 示例 ---
# 注意:请将下面的版本号和文件名替换为你在第一步中获取到的实际值
wget -O builds/chromium/1187/chromium-mac-arm64.zip "https://cdn.playwright.dev/dbazure/download/playwright/builds/chromium/1187/chromium-mac-arm64.zip"
wget -O builds/firefox/1490/firefox-mac-arm64.zip "https://cdn.playwright.dev/dbazure/download/playwright/builds/firefox/1490/firefox-mac-arm64.zip"
wget -O builds/webkit/2203/webkit-mac-15-arm64.zip "https://cdn.playwright.dev/dbazure/download/playwright/builds/webkit/2203/webkit-mac-15-arm64.zip"
wget -O builds/ffmpeg/1011/ffmpeg-mac-arm64.zip "https://cdn.playwright.dev/dbazure/download/playwright/builds/ffmpeg/1011/ffmpeg-mac-arm64.zip"

注意: Windows 或 Linux 用户请下载对应的 *.zip 文件,并确保目录结构正确。

第三步:启动本地 HTTP 服务

在存放依赖的基础目录(即 INSTALL_BASE_DIR)下,启动一个简单的 HTTP 服务器。Python 内置的 http.server 模块是在本地快速启动服务的理想选择。

shell
cd "${INSTALL_BASE_DIR}"
python3 -m http.server 8000
# 服务器将在 http://127.0.0.1:8000 启动

此时,你应该可以通过 http://127.0.0.1:8000/builds/chromium/1187/chromium-mac-arm64.zip 这样的 URL 访问到已下载的文件。

第四步:指定下载源并执行安装

最后,设置 PLAYWRIGHT_DOWNLOAD_HOST 环境变量,指向你刚刚启动的本地服务器地址,然后执行标准的 playwright install 命令。

shell
# 将 PLAYWRIGHT_DOWNLOAD_HOST 指向本地服务器
export PLAYWRIGHT_DOWNLOAD_HOST="http://127.0.0.1:8000"

# 执行安装
# For Node.js
npx playwright install

# For Python
python -m playwright install

Playwright 安装脚本此时会从你的本地服务器请求依赖文件,由于文件已存在于本地,下载过程将瞬间完成,随后自动进行解压和安装。

拓展与最佳实践

  • 企业级方案: 在团队或企业环境中,更推荐将这些浏览器依赖文件托管在内部的制品库(如 Artifactory, Nexus)或对象存储(如 MinIO)上。只需将 PLAYWRIGHT_DOWNLOAD_HOST 指向该内部仓库的地址,即可为所有团队成员和 CI/CD 环境提供一个稳定、高速的依赖源。
  • 管理安装路径: 除了下载源,你还可以通过 PLAYWRIGHT_BROWSERS_PATH 环境变量来指定浏览器依赖的最终安装位置,默认路径通常在用户主目录的缓存文件夹下(如 ~/.cache/ms-playwright)。

总结

通过利用 PLAYWRIGHT_DOWNLOAD_HOST 环境变量,我们可以有效规避因网络问题导致的 Playwright 依赖安装失败,确保开发和部署流程的稳定性和可重复性。该方法不仅适用于个人开发者应对网络限制,也为在隔离网络中配置 CI/CD 流水线提供了可靠的实践方案。