在使用 Google Antigravity IDE 或其他基于 Playwright 的浏览器自动化工具时,遇到一个困扰的问题:下载的文件被自动重命名为 UUID 格式,并保存到临时目录,这导致博主在下载东西时无法自动化,反而降低了效率。本文深入分析这个问题的原因,并提供详细的解决方案。
问题现象
当使用 Antigravity IDE 控制 Chrome 浏览器下载文件时,出现以下异常行为:
- 文件名变成 UUID:如
f6746de9-95f6-4c06-b636-3ac7c2fb73bc,而非原始文件名 - 保存位置异常:文件被保存到
C:\Users\<用户名>\AppData\Local\Temp\playwright-artifacts-xxxxx临时目录 - 每次会话独立:每次启动浏览器都会创建新的临时目录
问题原因分析
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
C:\Users\<用户名>\AppData\Local\ms-playwright-go\1.50.1\package\lib\server\chromium\crBrowser.js
修改内容:将 allowAndName 改为 allow,并移除 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' ? 'allow' : 'deny',
+ browserContextId: this._browserContextId,
说明:使用
allow行为并移除downloadPath,让浏览器使用其原生下载目录(通常是用户的”下载”文件夹)。
重要提示:修改后需要重启 Antigravity IDE(或相关应用程序)才能生效。验证步骤:
- 关闭所有由 Antigravity 控制的 Chrome 浏览器窗口
- 完全退出 Antigravity IDE
- 重新启动 Antigravity
- 测试下载功能
相关 GitHub Issues
| Issue | 描述 | 状态 |
|---|---|---|
| #32692 | 请求支持用户指定的下载文件名 | Open |
| #7464 | UUID 文件名是否是预期行为 | Closed |
| #2058 | 允许使用自然浏览器文件名 | Closed |
总结
Playwright 的下载拦截行为是有意设计的,目的是确保自动化测试的隔离性。对于 Antigravity 用户,需要修改 crBrowser.js:
- 将
allowAndName改为allow - 移除
downloadPath参数
修改后关闭浏览器并重启 Antigravity 即可恢复正常下载行为,文件将保存到浏览器默认下载目录。
参考资料: