在使用 Google Antigravity IDE 或其他基于 Playwright 的浏览器自动化工具时,遇到一个困扰的问题:下载的文件被自动重命名为 UUID 格式,并保存到临时目录,这导致博主在下载东西时无法自动化,反而降低了效率。本文深入分析这个问题的原因,并提供详细的解决方案。

问题现象

当使用 Antigravity IDE 控制 Chrome 浏览器下载文件时,出现以下异常行为:

  1. 文件名变成 UUID:如 f6746de9-95f6-4c06-b636-3ac7c2fb73bc,而非原始文件名
  2. 保存位置异常:文件被保存到 %LOCALAPPDATA%\Temp\playwright-artifacts-xxxxx 临时目录
  3. 每次会话独立:每次启动浏览器都会创建新的临时目录

问题原因分析

Playwright 的下载拦截机制

Playwright 是一个强大的浏览器自动化框架,被许多 IDE 和测试工具采用(如 Google Antigravity)。它默认会拦截所有下载操作,这是其核心设计特性。

通过分析 Playwright 源码 crBrowser.ts,可以找到问题的根源:

1
2
3
4
5
6
7
8
9
// CRBrowserContext._initialize() 中的代码
if (this._options.acceptDownloads !== 'internal-browser-default') {
  promises.push(this._browser._session.send('Browser.setDownloadBehavior', {
    behavior: this._options.acceptDownloads === 'accept' ? 'allowAndName' : 'deny',
    browserContextId: this._browserContextId,
    downloadPath: this._browser.options.downloadsPath,
    eventsEnabled: true,
  }));
}

CDP Browser.setDownloadBehavior 参数解析

Playwright 使用 Chrome DevTools Protocol (CDP) 的 Browser.setDownloadBehavior 命令来控制下载行为:

behavior 值 行为描述 文件名 downloadPath
deny 拒绝所有下载 N/A 不需要
allow 允许下载,使用原始文件名 原始名 必须指定
allowAndName 允许下载,使用 GUID 命名 UUID 必须指定
default 浏览器默认行为 原始名 可省略

关键区别

  • allow:虽然保留原始文件名,但必须指定 downloadPath,文件仍会保存到指定目录
  • default:使用浏览器原生下载行为,可以省略 downloadPath,文件保存到浏览器默认下载目录

问题根源:Playwright 硬编码使用了 allowAndName 模式,这是有意设计,目的是:

  • 防止多次下载时的文件名冲突
  • 确保自动化测试的隔离性
  • 便于 Playwright 追踪和管理下载

解决方案

修改 Playwright 源码

找到并修改 Playwright 核心文件:

文件路径

1
%LOCALAPPDATA%\ms-playwright-go\1.50.1\package\lib\server\chromium\crBrowser.js

修改内容:将 allowAndName 改为 default,并移除 downloadPath 参数

1
2
3
4
5
- behavior: this._options.acceptDownloads === 'accept' ? 'allowAndName' : 'deny',
- browserContextId: this._browserContextId,
- downloadPath: this._browser.options.downloadsPath,
+ behavior: this._options.acceptDownloads === 'accept' ? 'default' : 'deny',
+ browserContextId: this._browserContextId,

说明:使用 default 行为(浏览器默认行为),Playwright 将不再拦截下载,文件会直接保存到浏览器配置的默认下载目录。

[!WARNING] 千万不要使用 allow 且不指定路径:CDP 协议规定 behavior: 'allow' 时必须提供 downloadPath。如果移除 downloadPath 但仍使用 'allow',会导致 CDP 命令参数校验失败,进而导致 Playwright 无法启动浏览器(报错或卡在 invoke 阶段)。

重要提示:修改后需要重启 Antigravity IDE(或相关应用程序)才能生效。验证步骤:

  1. 关闭所有由 Antigravity 控制的 Chrome 浏览器窗口
  2. 完全退出 Antigravity IDE
  3. 重新启动 Antigravity
  4. 测试下载功能

相关 GitHub Issues

Issue 描述 状态
#32692 请求支持用户指定的下载文件名 Open
#7464 UUID 文件名是否是预期行为 Closed
#2058 允许使用自然浏览器文件名 Closed

不知道修改哪个路径的 crBrowser.js?

有时候,需要从 Claude Code 通过 playwright 来访问 Chrome,不清楚用到了哪个路径下的 crBrowser.js 文件,则可以通过下述步骤找到生效的 crBrowser.js 文件,然后对它定制。

先打开 Everything,搜索 crBrowser.js 路径:

image-20260416182014517

打开 Process Monitor,点击Filter,然后将刚才出现的路径全部加进来,监控它们: image-20260416181954393

image-20260416182053561

然后模拟实际的操作:打开 Antigravity 里的 Chrome,并打开 Antigravity 里的 Claude Code 或者自带的 AI Chat,下发指令让 AI 打开 chrome

这时可以在 Process Monitor 里看到:访问了哪些路径的 crBrowser.js 文件。 image-20260416182100074

然后就可以逐个修改逐个验证,不行再修改另一个;或者一次性全部修改完即可。

总结

Playwright 的下载拦截行为是有意设计的,目的是确保自动化测试的隔离性。对于 Antigravity 用户,需要修改 crBrowser.js

  1. allowAndName 改为 default
  2. 移除 downloadPath 参数

修改后关闭浏览器并重启 Antigravity 即可恢复正常下载行为,文件将保存到浏览器默认下载目录。


参考资料: