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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:17:33