如何在Cypress测试执行结束后删除测试过程中下载的文件
Cypress 测试执行后删除下载文件的实现方案
前置说明
Cypress 本身不直接提供文件系统操作的API,你需要通过注册task调用Node.js的fs模块实现文件删除,以下是两种常用的实现方式:
方式1:单个测试用例结束后删除指定文件
适合只需要删除当前用例产生的特定下载文件的场景
- 首先在
cypress.config.js中注册删除文件的自定义任务
const { defineConfig } = require('cypress') const fs = require('fs/promises') const path = require('path') module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('task', { // 接收文件名作为参数,删除对应下载文件 deleteFile(fileName) { const targetPath = path.join(config.downloadsFolder, fileName) return fs.unlink(targetPath) .then(() => true) .catch(err => { // 文件不存在或删除失败时不抛出测试错误,可按需调整逻辑 console.log(`删除文件失败:${err.message}`) return false }) } }) } } })
- 在测试用例的
after钩子中调用该任务
describe('下载功能测试', () => { // 替换为你的实际下载文件名,动态文件名可在测试过程中捕获赋值 const downloadFileName = 'test_export.xlsx' it('点击下载按钮正常生成文件', () => { cy.get('.download-btn').click() // 等待文件下载完成,避免删除时文件还未生成 cy.readFile(`${Cypress.config('downloadsFolder')}/${downloadFileName}`, { timeout: 15000 }).should('exist') }) // 当前describe块下的所有用例执行完成后触发删除 after(() => { cy.task('deleteFile', downloadFileName) }) })
方式2:全部测试执行完成后清空整个下载目录
适合需要统一清理所有测试产生的下载文件的场景
- 在
cypress.config.js的setupNodeEvents中新增清空目录的任务
on('task', { clearDownloadsDir() { const downloadDir = config.downloadsFolder return fs.readdir(downloadDir) .then(fileList => { return Promise.all( fileList.map(file => fs.unlink(path.join(downloadDir, file))) ) }) .then(() => true) .catch(err => { console.log(`清空下载目录失败:${err.message}`) return false }) } })
- 在全局钩子中调用该任务,在
cypress/support/e2e.js中添加如下代码:
// 所有测试用例全部执行完成后触发清空 after(() => { cy.task('clearDownloadsDir') })
注意事项
- Cypress 默认下载目录为
cypress/downloads,如果你自定义了下载路径,需要将代码中的路径替换为实际配置的路径 - 如果下载的是动态文件名,可先读取下载目录下符合命名规则的文件,再批量删除
- 文件操作的错误捕获逻辑可按需调整,如果你需要删除失败时抛出测试错误,去掉catch逻辑即可
内容的提问来源于stack exchange,提问作者F.C.
相关产品推荐
相关产品推荐

