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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:54:22