Cypress调用attachFile上传PDF提交后文件消失提示需上传文件
问题原因
你这段Cypress上传代码有两个致命错误,直接导致上传校验失败:
- 错误1:错误转换二进制文件内容。PDF是二进制格式文件,你写的
fileContent.toString()会把二进制内容转成UTF-8字符串,直接破坏PDF的原始文件结构,前端/后端校验读取文件时,根本识别不到合法的PDF文件标识,直接判定为无效文件。 - 错误2:MIME类型配置错误。PDF文件的标准MIME类型是
application/pdf,你代码里写的text/pdf是无效类型,大部分上传组件会在提交时先校验文件MIME类型,类型不匹配直接拦截抛出"请上传PDF文件"的错误。
另外你写的cy.wait(10000)硬等待固定时长的写法非常不稳定,容易因为页面加载时序波动导致元素还没就绪就执行上传操作。
修复方案
直接替换成以下代码即可:
// 等待上传控件就绪,替代固定时长等待 cy.get('#Shipment_PaperlessFile').should('be.visible') // 读取fixture时传入null作为编码参数,保留PDF原始二进制内容,不做转码 cy.fixture('pdf1.pdf', null).then(fileContent => { cy.get('#Shipment_PaperlessFile').attachFile({ fileContent: fileContent, fileName: 'pdf1.pdf', mimeType: 'application/pdf' // 使用PDF标准MIME类型 }) }) // 可选:增加上传结果校验,避免时序问题 cy.get('#Shipment_PaperlessFile') .should('have.prop', 'files') .its(0.name) .should('eq', 'pdf1.pdf')
补充排错点
如果替换代码后仍上传失败,按以下点排查:
- 确认
attachFile绑定的是页面实际接收文件的原生<input type="file">元素,不是前端渲染的样式上传按钮,很多组件会把原生input设为透明覆盖在样式按钮上,选错元素会导致文件挂载无效 - 所有二进制格式文件(PDF、图片、压缩包、Office文档等)读取fixture时都不要调用
toString()转字符串,必须保留原始二进制内容 - 如果组件做了文件大小校验,确认你放在fixtures里的pdf1.pdf大小符合组件限制要求
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

