You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}); 

额外排查建议

  1. 可以在代码中打印路径,确认路径是否正确:console.log(targetFilePath);
  2. 如果还是无法保存,可以先尝试保存到项目内的临时目录(比如./temp/download.xlsx),排除系统目录的权限问题。
  3. 也可以通过Playwright的上下文配置指定全局下载目录,更便于管理:
    const context = await browser.newContext({
      downloadsPath: './downloads', // 自定义项目内下载目录
    });
    

备注:内容来源于stack exchange,提问作者Krishnendu Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:45:27