Install
openclaw skills install playwright-download-fix自动处理 Playwright 下载文件名问题,监听下载事件并用正确的原始文件名保存文件。解决 Playwright 下载的文件名是 UUID 而不是原始文件名的问题。
openclaw skills install playwright-download-fixPlaywright 下载的文件名是 UUID 而不是原始文件名?这个 skill 帮你自动修复这个问题。
当使用 Playwright 下载文件时,经常会遇到:
f63a84ec-abd1-48fa-a748-11ebeca07935(UUID)MVIMG_20250706_131754.jpgdownload 事件并使用 suggestedFilename() 获取原始文件名这个 skill 提供了一个 DownloadHelper 模块,自动监听下载事件并用正确的文件名保存文件。
确保快捷命令已添加到 shell 配置文件:
```bash
echo "alias pw-start='cd ~/.openclaw-autoclaw/workspace && node pw-start.js'" >> ~/.zshrc source ~/.zshrc
pw-start # 打开默认页面(智联招聘) pw-start https://example.com # 打开指定 URL ```
每次运行都会自动加载 DownloadHelper skill 并显示配置信息:
========================================
📋 配置信息
========================================
🌐 User-Agent: 真实 Chrome (macOS)
📂 下载目录: /Users/allen/downloads
🔍 调试模式: 开启
========================================
```bash cd ~/.openclaw-autoclaw/skills/playwright-download-fix node standalone-script.js ```
```bash
cp ~/.openclaw-autoclaw/skills/playwright-download-fix/download-helper.js . ```
然后在脚本中使用:
```javascript const { chromium } = require('playwright'); const DownloadHelper = require('./download-helper');
async function myScript() { const browser = await chromium.launch({ headless: false }); const context = await browser.newContext({ acceptDownloads: true, });
const page = await context.newPage();
// 初始化下载助手 const helper = new DownloadHelper(page, { downloadDir: '~/downloads', debug: true }); const downloadDir = await helper.setup(); console.log(`📂 下载目录: ${downloadDir}`);
// 你的自动化代码... await page.goto('https://example.com'); await page.click('#download-button');
// 获取下载的文件列表 console.log('下载的文件:', helper.getDownloadedFiles());
await browser.close(); }
myScript(); ```
```bash
npm install playwright
npx playwright install chromium ```
~/downloads)有写权限默认配置(可在 pw-start.js 中修改):
| 配置项 | 默认值 | 说明 |
|---|---|---|
| User-Agent | Chrome 122.0.0.0 (macOS) | 模拟真实浏览器 |
| Locale | zh-CN | 中文环境 |
| Timezone | Asia/Shanghai | 中国时区 |
| 下载目录 | ~/downloads | 文件保存位置 |
| 调试模式 | 开启 | 显示下载信息 |
为了更接近真实浏览器,默认启用以下配置:
```javascript const context = await browser.newContext({ userAgent: realChromeUA, locale: 'zh-CN', timezoneId: 'Asia/Shanghai', bypassCSP: true, javaScriptEnabled: true, acceptDownloads: true, }); ```
```javascript new DownloadHelper(page, options) ```
参数:
初始化下载监听器,创建下载目录(如果不存在)。
```javascript const downloadDir = await helper.setup(); ```
返回: 下载目录的绝对路径
获取本次会话中下载的所有文件路径列表。
```javascript const files = helper.getDownloadedFiles(); console.log('下载的文件:', files); ```
返回: 文件路径数组
清空下载历史记录。
```javascript helper.clearHistory(); ```
移除下载监听器。
```javascript helper.dispose(); ```
```javascript const { chromium } = require('playwright'); const DownloadHelper = require('./download-helper');
async function downloadSingle() { const browser = await chromium.launch({ headless: false }); const context = await browser.newContext({ acceptDownloads: true, });
const page = await context.newPage();
const helper = new DownloadHelper(page, { downloadDir: '~/downloads', debug: true }); await helper.setup();
await page.goto('https://example.com'); await page.click('#download-button'); await page.waitForTimeout(3000);
const files = helper.getDownloadedFiles(); console.log('下载的文件:', files);
await browser.close(); }
downloadSingle(); ```
```javascript const { chromium } = require('playwright'); const DownloadHelper = require('./download-helper');
async function downloadMultiple(urls) { const browser = await chromium.launch({ headless: false }); const context = await browser.newContext({ acceptDownloads: true }); const page = await context.newPage();
const helper = new DownloadHelper(page, { downloadDir: '~/downloads', debug: true }); await helper.setup();
for (const url of urls) { await page.goto(url); await page.click('.download-link'); await page.waitForTimeout(2000); }
console.log(`共下载 ${helper.getDownloadedFiles().length} 个文件`);
await browser.close(); }
downloadMultiple(['url1', 'url2', 'url3']); ```
```javascript const { chromium } = require('playwright'); const DownloadHelper = require('./download-helper');
async function downloadResumes() { const browser = await chromium.launch({ headless: false }); const context = await browser.newContext({ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', acceptDownloads: true, });
const page = await context.newPage();
const helper = new DownloadHelper(page, { downloadDir: '~/downloads', debug: true }); await helper.setup();
// 导航到搜索页面 await page.goto('https://rd6.zhaopin.com/app/search');
// 手动登录...
// 搜索候选人并下载简历 // ...
await browser.close(); }
downloadResumes(); ```
可能原因:
解决方案:
```javascript // 连接真实 Chrome const browser = await chromium.connectOverCDP('http://localhost:9222'); ```
可能原因:
解决方案: ```javascript // 1. 确保设置 acceptDownloads const context = await browser.newContext({ acceptDownloads: true, // 必须设置 });
// 2. 检查目录权限 fs.accessSync(downloadDir, fs.constants.W_OK);
// 3. 查看 debug 输出 const helper = new DownloadHelper(page, { debug: true }); ```
可能原因:
解决方案: ```javascript // 使用绝对路径 const helper = new DownloadHelper(page, { downloadDir: '/Users/yourname/Downloads', // 绝对路径 });
// 或使用 ~ 符号 const helper = new DownloadHelper(page, { downloadDir: '~/downloads', // 会自动解析为用户主目录 }); ```
解决方案: ```bash
echo "alias pw-start='cd ~/.openclaw-autoclaw/workspace && node pw-start.js'" >> ~/.zshrc
source ~/.zshrc
```
主启动脚本,位于 `~/.openclaw-autoclaw/workspace/pw-start.js`
可配置项: ```javascript const CONFIG = { userAgent: '...', // 自定义 User-Agent locale: 'zh-CN', // 语言 timezoneId: 'Asia/Shanghai', // 时区 downloadDir: '~/downloads', // 下载目录 debug: true, // 调试模式 defaultUrl: '...' // 默认 URL }; ```
独立运行脚本,位于 `~/.openclaw-autoclaw/skills/playwright-download-fix/standalone-script.js`
特点:
核心模块,可复制到任何项目使用。
```bash pw-start
```
```bash pw-start https://example.com
```
```bash pw-start http://localhost:3000
```
在自动化脚本中集成 `DownloadHelper`,实现批量下载。
```bash ls ~/downloads ```
当前仅支持 Chromium,但可以通过修改 `pw-start.js` 使用 Firefox 或 WebKit:
```javascript const { firefox } = require('playwright'); const browser = await firefox.launch(); ```
MIT