Playwright JavaScript中文件下载后无法找到已保存文件的问题求助
Playwright JavaScript中文件下载后无法找到已保存文件的问题求助
问题描述
我点击页面的下载按钮后,按钮能正常触发下载动作,但始终找不到代码里指定保存的文件。手动下载该文件是正常的,不过我的磁盘开启了BitLocker加密,会不会是这个原因导致Playwright无法正常保存文件?
我的实现代码
test('Upload Download Excel Validation', async ({ page }) => { await page.goto("https://rahulshettyacademy.com/upload-download-test/index.html") const downloadPromise = page.waitForEvent('download'); await page.getByRole('button',{name:'Download'}).click(); await page.pause(); await page.locator("#downloadButton").click(); const download = await downloadPromise; await download.saveAs('C:\Users\KrishnenduDas\Downloads\download.xlsx' + download.suggestedFilename()); writeExcelTest("Apple", 350, "C:\Users\KrishnenduDas\Downloads\download.xlsx", { rowchange: 0, colchange: 2 }) await page.locator("#fileinput").click(); await page.locator("#fileinput").setInputFiles("C:\Users\KrishnenduDas\Downloads\download.xlsx") })
实际保存的异常情况
从截图可以看到,保存的文件名出现了乱码拼接的异常:
问题分析与解决方案
1. 路径转义字符错误(最核心的问题)
在JavaScript中,\是转义字符,你代码里的Windows路径使用单反斜杠,会被解析为转义序列(比如\U会被当作特殊转义符处理),最终导致路径失效、文件名乱码,文件根本没有保存到你预期的目录。
修复方式:
把路径中的单反斜杠\替换为双反斜杠\\,或者直接使用正斜杠/(Windows也支持正斜杠路径)。
2. 重复触发下载操作
代码里连续点击了两次下载按钮:
await page.getByRole('button',{name:'Download'}).click(); // ... await page.locator("#downloadButton").click();
这会触发两次下载事件,可能导致downloadPromise捕获的下载流被干扰,建议只保留其中一个点击操作(两个选择器指向的应该是同一个按钮)。
3. saveAs路径拼接逻辑错误
你当前的saveAs代码会把固定文件名和下载建议文件名直接拼接,导致文件名变成download.xlsx[原建议文件名]的异常格式。如果要自定义文件名,直接传入完整路径即可,不需要额外拼接。
4. BitLocker的影响排查
手动下载正常说明BitLocker不会阻止文件写入,Playwright运行在你的用户权限下,只要你能手动操作,Playwright也能正常访问该目录,所以这个大概率不是问题。
修改后的可运行示例代码
test('Upload Download Excel Validation', async ({ page }) => { // 定义正确的下载路径,使用双反斜杠转义 const targetFilePath = 'C:\\Users\\KrishnenduDas\\Downloads\\download.xlsx'; await page.goto("https://rahulshettyacademy.com/upload-download-test/index.html"); // 先监听下载事件,再触发一次下载 const downloadPromise = page.waitForEvent('download'); await page.locator("#downloadButton").click(); const download = await downloadPromise; // 直接保存到指定路径 await download.saveAs(targetFilePath); // 后续Excel编辑与上传操作 writeExcelTest("Apple", 350, targetFilePath, { rowchange: 0, colchange: 2 }); // 不需要单独点击文件输入框,setInputFiles会自动触发上传 await page.locator("#fileinput").setInputFiles(targetFilePath); });
额外排查建议
- 可以在代码中打印路径,确认路径是否正确:
console.log(targetFilePath); - 如果还是无法保存,可以先尝试保存到项目内的临时目录(比如
./temp/download.xlsx),排除系统目录的权限问题。 - 也可以通过Playwright的上下文配置指定全局下载目录,更便于管理:
const context = await browser.newContext({ downloadsPath: './downloads', // 自定义项目内下载目录 });
备注:内容来源于stack exchange,提问作者Krishnendu Das
相关产品推荐
相关产品推荐

