Electron浏览器下载文件时是否使用临时文件名?
Electron下载文件的临时文件名机制说明及Cypress测试解决方案
核心问题确认
Electron 默认没有采用类似Chrome的临时文件名机制——它会直接以最终文件名保存下载中的文件,下载过程中数据是逐步写入该文件的。这就是你遇到问题的原因:测试代码检测到文件存在就立即尝试解压,但此时文件还未完全下载完成,Zip的END头还未写入,导致解压工具报错;而测试结束后下载完成,文件自然恢复正常。
针对Cypress测试的解决办法
1. 监听Electron的下载完成事件
在Cypress测试中,可以通过Electron的下载事件监听,确保等待下载完全结束后再执行解压操作:
cy.window().then((win) => { const browser = win.parent; browser.on('download', (downloadItem) => { downloadItem.on('done', (event, state) => { if (state === 'completed') { // 这里执行解压操作 unzipDownloadedFile(); } }); }); });
2. 校验文件完整性后再解压
如果无法监听下载事件,可以通过检查文件大小的稳定性来判断下载是否完成:
function waitForFileComplete(filePath, interval = 1000, timeout = 10000) { let previousSize = -1; const startTime = Date.now(); return cy.wrap(null).then(() => { return new Cypress.Promise((resolve, reject) => { const checkSize = () => { cy.readFile(filePath, { encoding: null }).then((buffer) => { const currentSize = buffer.length; if (currentSize === previousSize) { resolve(); } else if (Date.now() - startTime > timeout) { reject(new Error('File download timed out')); } else { previousSize = currentSize; setTimeout(checkSize, interval); } }); }; checkSize(); }); }); } // 使用示例 waitForFileComplete('/path/to/downloaded.zip').then(() => { // 执行解压 });
3. 切换至Chrome浏览器执行测试
如果项目允许,直接切换Cypress的测试浏览器为Chrome。Chrome会将未完成的下载保存为.crdownload文件,只有下载完成后才会重命名为最终文件名,测试代码只需监听最终文件名的出现即可安全解压。
内容的提问来源于stack exchange,提问作者MartinP
相关产品推荐
相关产品推荐

