在Cypress中使用pdf-parse报错:Fs.readFileSync is not a function
解决Cypress中使用pdf-parse出现"Fs.readFileSync is not a function"的问题
错误原因
pdf-parse是为Node.js环境开发的库,依赖Node.js的fs核心模块。但Cypress的测试代码默认运行在浏览器环境中,浏览器没有fs模块,直接在测试代码中引入pdf-parse就会触发这个错误。
解决方案:用Cypress任务(Task)在Node.js环境解析PDF
Cypress的任务(task)运行在Node.js环境,可以访问fs模块,适合处理这类需要Node.js API的操作。
步骤1:配置Cypress任务
在cypress.config.js中添加解析PDF的任务:
const { defineConfig } = require("cypress"); const pdfParse = require('pdf-parse'); const fs = require('fs'); module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { // 添加解析PDF的任务 on('task', { async parsePdf(filePath) { const dataBuffer = fs.readFileSync(filePath); const pdfData = await pdfParse(dataBuffer); return pdfData; } }); }, }, });
步骤2:修改测试代码调用任务
移除测试代码中的import PdfParse from 'pdf-parse';,改用cy.task调用上面定义的任务:
/// <reference types="Cypress" /> import Loader from './loader.js'; import Login from './login.js' import PageActions from './pageActions.js'; import Validations from './validations.js'; describe('', () => { const login = new Login() const loader = new Loader() const pageActions = new PageActions() const validations = new Validations() it('', () => { cy.visit('/') login.userName() login.password(); login.clickSignIn() loader.waitForLoaderToFinish() pageActions.clickView(); loader.waitForLoaderToFinish(); pageActions.clickLibrary(); loader.waitForLoaderToFinish() pageActions.clickDownload(); loader.waitForLoaderToFinish(); validations.validatePDFHasBeenDownloaded(); // 调用task解析PDF cy.task('parsePdf', './cypress/downloads/Application Form.pdf').then(pdfData => { cy.log(pdfData.text); // 打印PDF文本内容 // 添加验证逻辑,比如检查文本是否包含特定内容 expect(pdfData.text).to.include('预期的文本内容'); }); }); })
替代方案:使用专门的Cypress PDF库
可以使用cypress-pdf库,它封装了PDF解析逻辑,更适合Cypress场景:
- 安装库:
npm install cypress-pdf --save-dev
- 在
cypress/support/e2e.js中引入:
require('cypress-pdf');
- 测试中直接使用:
cy.readPdf('./cypress/downloads/Application Form.pdf').then(pdf => { expect(pdf.text).to.include('目标文本'); });
额外注意点
- 原代码中
Actions.clickLibrary();需修正为pageActions.clickLibrary();,保证变量名一致性。 - 确保下载的PDF路径正确,Cypress默认下载目录是
cypress/downloads,如有自定义路径需同步调整。
内容的提问来源于stack exchange,提问作者Michael Paleologos
相关产品推荐
相关产品推荐

