Playwright下载包为什么浏览器能访问,命令行(Terminal/Command Prompt)却不行?
为什么浏览器能访问,命令行(Terminal/Command Prompt)却不行?
这通常是因为浏览器和命令行处于两个不同的“网络维度”。即使在同一台电脑上,它们的流量路径、证书校验和代理配置往往是完全独立的。
以下是导致这种现象的几个核心原因:
1. 代理配置不同步 (Proxy Settings)
这是最常见的原因。
- 浏览器: 通常会自动检测系统的代理设置(PAC脚本或系统代理),或者你安装了类似 SwitchyOmega 的插件,它能聪明地处理流量。
- 命令行: 默认不会自动读取系统的代理开关。即使你开了 VPN,如果它是“增强模式”没覆盖到终端,或者没有配置环境变量,
pnpm和playwright依然在尝试“肉身出海”,结果被防火墙拦截。
2. TLS/SSL 握手失败 (Certificate Issues)
报错中的 TLSWrap.onStreamRead 暗示了在建立安全连接时出错了。
- 浏览器: 内置了非常强大的根证书库,并且能处理各种复杂的加密握手。
- 命令行: Node.js 使用的是自带的证书库。如果你的网络环境(如公司内网)进行了 SSL 深度包检测 (SSL Inspection),它会拦截请求并替换证书。浏览器可能信任这个拦截证书,但 Node.js 不认识,于是直接切断连接(
ECONNRESET)。
3. 并发连接数与 CDN 限制
- 浏览器: 下载文件通常是单线程或简单的并发。
- Playwright: 为了提速,它的下载器可能会尝试开启多个连接。部分网络服务商或 CDN 如果检测到短时间内来自非浏览器标识(User-Agent)的高频请求,会直接通过重置连接(Reset)来“拒客”。
解决办法:让命令行走浏览器的路
既然浏览器能下,说明你的网络本身是通的,只是命令行没找到路。你可以尝试以下操作:
方案 A:手动配置代理(最有效)
如果你正在使用 VPN,请查看它的 HTTP 代理端口(通常是 7890、1080 等),然后在终端输入:
# 如果是 PowerShell
$env:HTTP_PROXY="http://127.0.0.1:你的端口"
$env:HTTPS_PROXY="http://127.0.0.1:你的端口"
# 然后再执行安装
pnpm exec playwright install chromium
方案 B:换成国内镜像源(最省事)
既然官方 CDN 抽风,改用国内的镜像服务(如淘宝/华为):
$env:PLAYWRIGHT_DOWNLOAD_HOST="https://npmmirror.com/mirrors/playwright"
pnpm exec playwright install chromium
方案 C:手动安装(绕过命令行下载)
既然浏览器能下,你可以手动“欺骗” Playwright:
- 在浏览器下载那个
.zip文件。 - 查看报错信息中的路径(通常在
%USERPROFILE%\AppData\Local\ms-playwright)。 - 将下载的文件解压到对应的文件夹中。(这种方法比较麻烦,因为文件夹命名规则很严格,建议优先尝试方案 B)。
浙公网安备 33010602011771号