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

如何在Cypress的cy.task()函数(validateZipFile、getZipFileSize)中添加等待?

解决Cypress下载Zip文件时因未完成导致任务失败的等待机制

要解决文件未下载完成就执行验证任务的问题,核心是在Node端的cy.task中添加轮询等待逻辑,确保文件存在且下载完成(大小稳定)后再执行后续操作。以下是具体修改方案:

1. 完善cypress.config.js中的任务逻辑

首先引入fs和path模块(若未引入),然后给两个任务添加等待机制:

const AdmZip = require("adm-zip");
const fs = require('fs');
const path = require('path');
const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 封装等待文件下载完成的工具函数
      const waitForFile = async (filePath, timeout = 30000, interval = 1000) => {
        const startTime = Date.now();
        let previousSize = -1;

        while (Date.now() - startTime < timeout) {
          try {
            // 检查文件是否存在
            if (fs.existsSync(filePath)) {
              const stats = fs.statSync(filePath);
              // 检查文件大小是否稳定(连续两次读取大小一致,视为下载完成)
              if (stats.size === previousSize && stats.size > 0) {
                return stats;
              }
              previousSize = stats.size;
            }
          } catch (err) {
            // 文件未存在时忽略错误,继续轮询
          }
          // 间隔指定时间后再次检查
          await new Promise(resolve => setTimeout(resolve, interval));
        }
        throw new Error(`文件 ${filePath} 超时未下载完成`);
      };

      on('task', {
        async validateZipFile(filename) {
          const filePath = path.join(config.downloadsFolder, filename);
          // 等待文件下载完成
          await waitForFile(filePath);
          // 验证Zip内容
          const zip = new AdmZip(filePath);
          const zipEntries = zip.getEntries();
          const names = zipEntries.map(entry => entry.entryName).sort();
          return names;
        },
        async getZipFileSize(filename) {
          const filePath = path.join(config.downloadsFolder, filename);
          // 等待文件下载完成
          const stats = await waitForFile(filePath);
          return stats.size;
        }
      });

      return config;
    },
    baseUrl: "https://staging-qa.someurl.com/",
    specPattern: "cypress/e2e/**/*.spec.{js,jsx,ts,tsx}",
  },
});

function validateZipFile(filename) {
  const zip = new AdmZip(filename)
  const zipEntries = zip.getEntries()
  const names = zipEntries.map(entry => entry.entryName).sort()
  return names
}

2. 关键逻辑说明

  • waitForFile工具函数:
    • 轮询检查文件是否存在,默认超时30秒,每1秒检查一次
    • 通过对比连续两次的文件大小,判断文件是否已下载完成(避免读取到未写完的临时文件)
    • 超时后抛出错误,便于Cypress捕获并标记测试失败
  • async/await改造任务:将两个task改为异步函数,等待文件就绪后再执行验证逻辑

3. 测试代码无需修改

原test.spec.js和helperFunctions.js的代码保持不变即可,Cypress会自动处理异步任务的等待逻辑。

内容的提问来源于stack exchange,提问作者soccerway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:35:11