Selenium与Playwright+C#自动化测试中如何保留下载文件的原始文件名?
Selenium与Playwright+C#自动化测试中如何保留下载文件的原始文件名?
太懂你这种换工具就掉坑的感觉了!之前用Selenium下载文件顺理成章保留原始名,换成Playwright+C#之后突然变成一串看不懂的UUID,要做内容验证还得先跟文件名死磕,确实闹心。别慌,咱们用Playwright自带的下载事件监听就能解决这个问题,下面给你一步步说:
核心思路:捕获下载事件,获取原始文件名再重命名
Playwright默认会用随机UUID作为临时文件名,但它其实提供了监听下载事件的API,能拿到服务器返回的原始文件名,之后咱们只需要把临时文件重命名就行。
具体代码实现
先启动下载监听,再点击按钮
一定要在点击下载按钮前就启动等待下载的任务,不然很可能错过下载事件。代码示例:// 先开启下载等待任务 var downloadTask = page.WaitForDownloadAsync(); // 点击你的下载按钮,这里替换成你实际的按钮选择器 await page.ClickAsync("css=button.download-btn"); // 等待下载完成,获取下载对象 var download = await downloadTask;获取原始文件名并重命名文件
从Download对象里的SuggestedFilename属性就能拿到服务器返回的原始文件名(比如monthlyBudget.xlsx),然后用SaveAsAsync方法直接把文件保存成原始名:// 拼接最终保存路径,用原始文件名 var targetFilePath = Path.Combine(DownloadPath, download.SuggestedFilename); // 把临时下载文件重命名并保存到目标路径 await download.SaveAsAsync(targetFilePath);
备用方案:如果服务器没返回正确的文件名
要是遇到服务器没在响应头里返回原始文件名的情况,咱们还能从下载按钮的文本或属性里提取文件名,比如按钮上写着“Download monthlyBudget.xlsx”,可以这么做:
// 从按钮文本提取原始文件名 var buttonText = await page.TextContentAsync("your-download-button-selector"); var originalFilename = buttonText?.Replace("Download ", "") ?? "default-filename.xlsx"; // 获取临时下载文件的路径 var tempFilePath = await download.PathAsync(); // 重命名文件 if (!string.IsNullOrEmpty(tempFilePath)) { var targetPath = Path.Combine(DownloadPath, originalFilename); File.Move(tempFilePath, targetPath, overwrite: true); // overwrite: true表示覆盖同名文件 }
注意事项
- 确保
DownloadPath是你设置的有效路径,且程序有读写权限 - 用
SaveAsAsync的时候,Playwright会自动处理临时文件的移动,不用你手动删除原UUID文件 - 如果需要覆盖已存在的同名文件,在
File.Move里加上overwrite: true参数就行
内容来源于stack exchange
相关产品推荐
相关产品推荐

