Cypress解析下载PDF文件报错及cy.task未定义问题如何解决
Cypress 自定义Task读取PDF问题解决方案
问题根因
你遇到的两类报错分别来自三个代码逻辑错误:
- 误用内置
cy.readFile()读取PDF:cy.readFile()仅支持读取UTF-8编码的纯文本文件,无法解析二进制格式的PDF,且你注册的自定义Task不会覆盖内置同名命令,测试代码调用cy.readFile()时根本没有执行你写的PDF解析逻辑。 - PDF读取参数错误:给
fs.readFileSync()传入'utf8'编码参数读取PDF二进制文件,会导致文件内容损坏,解析失败。 - 插件进程非法访问Cypress全局:Cypress插件文件运行在Node.js后端进程,不存在浏览器侧的
Cypress全局对象,直接调用Cypress.config()会抛出Cypress未定义错误。
修复实现
1. 修正插件侧Task注册逻辑
在cypress/plugins/index.js中注册正确的PDF解析Task,不要在插件侧直接读取Cypress配置,读取PDF时不传编码参数保留二进制Buffer:
const fs = require('fs'); const path = require('path'); const pdf = require('pdf-parse'); // 请确认你使用的PDF解析库已正确安装引入 module.exports = (on, config) => { on('task', { getPdfContent(fullFilePath) { if (!fs.existsSync(fullFilePath)) { return null; } // 读取二进制Buffer,不传utf8编码 const pdfBuffer = fs.readFileSync(fullFilePath); return pdf.parse(pdfBuffer); } }); return config; };
2. 修正测试侧调用逻辑
测试代码中通过cy.task()调用自定义解析方法,路径拼接全部在测试侧完成,拿到解析结果后再做断言:
isUserRemovedFromExport(status: string, trainee: string, document: string) { const downloadsFolder = Cypress.config('downloadsFolder'); usersUtil.getCurrentCompany().then((company) => { const filename = `${dates.getShortFormattedToday()}-${company.name}-document-${document}-training-data.pdf`; const downloadFileName = path.join(downloadsFolder, filename); // 先等待文件下载完成,避免读文件时机过早 cy.readFile(downloadFileName, { timeout: 15000 }).should('exist'); // 调用自定义Task解析PDF cy.task('getPdfContent', downloadFileName).then((parseResult) => { // pdf-parse解析后的文本内容存放在text字段,根据你实际使用的解析库调整字段取值 expect(parseResult.text).to.include(trainee); }); }); }
注意事项
- 如果使用其他PDF解析库,请对应调整解析结果的字段取值逻辑,不要直接对整个解析返回对象做文本断言。
- 下载文件的等待超时时间可以根据实际文件大小调整,确保文件完全写入磁盘后再执行解析。
内容的提问来源于stack exchange,提问作者Laxmi
相关产品推荐
相关产品推荐

