Cypress如何测试XML文件上传 cy.fixture和selectFile怎么用

10次阅读

xml上传必须用cy.fixture()预加载再转Blob/File对象传给selectFile(),传路径字符串无效;需触发change事件、检查Content-Type及请求体格式,避免bom编码问题。

Cypress如何测试XML文件上传 cy.fixture和selectFile怎么用

XML文件上传测试必须用 cy.fixture() 预加载内容

直接传路径字符串给 selectFile() 不会生效,Cypress 不会自动读取文件内容。XML 文件必须先通过 cy.fixture() 加载为字符串或 Blob,再交给上传控件处理。否则上传的只是空内容或原始路径文本。

常见错误现象:cy.get('input[type="file"]').selectFile('test.xml') 看似执行成功,但后端收到的是空 body 或 400 错误,因为实际没传有效 XML 数据。

  • cy.fixture() 默认以 UTF-8 解析文本,对标准 XML 安全;若含特殊编码(如 ISO-8859-1),需显式指定 { encoding: NULL } 并手动处理 Buffer
  • XML 内容较大时(>1MB),建议用 { encoding: null } + new Blob([content], { type: 'application/xml' }) 避免字符串解析开销
  • fixture 路径是相对于 cypress/fixtures/ 目录的,不要写 ./fixtures/test.xml,直接写 test.xml

selectFile() 必须传 Blob 或 File 对象,不能传字符串路径

selectFile() 的参数不是文件路径,而是可被浏览器识别的文件对象。传字符串路径仅在极少数旧版 Cypress(

正确做法是把 cy.fixture() 返回的内容包装成 File 实例,并指定 type: 'application/xml' —— 否则部分后端框架(如 Spring Boot)会因 Content-Type 缺失拒绝请求。

cy.fixture('sample.xml', 'utf8').then(xmlContent => {   const blob = new Blob([xmlContent], { type: 'application/xml' });   const file = new File([blob], 'sample.xml', { type: 'application/xml' });    cy.get('input[type="file"]').selectFile(file); });

表单提交前要确认 input 已触发 change 事件

某些上传组件(如 Ant Design Upload、自定义 drag-drop 区域)依赖 change 事件触发内部逻辑。单纯调用 selectFile() 不一定触发该事件,尤其当 input 被隐藏或封装在 Shadow DOM 中。

  • 显式加 .trigger('change', { force: true }) 是最稳妥的做法
  • 如果上传按钮是 disabled 状态,检查是否因缺少 accept="application/xml" 属性导致校验失败
  • 使用 cy.get('input').should('have.value', 'C:\fakepath\sample.xml') 可验证文件名是否被正确设置(仅限 Chrome/Firefox)

后端接收不到 XML?重点查三件事

即使前端看起来上传成功,后端仍可能收不到 XML,问题往往出在协议层而非 Cypress 脚本本身。

  • 抓包看请求体:用 cy.intercept() 拦截上传请求,检查 request.body 是否为原始 XML 字符串,还是被转成了 base64 或 multipart/form-data 的非标准格式
  • 检查 Content-Type 请求头:selectFile() 不自动设 header,multipart 场景下由浏览器自动生成 boundary;若后端只接受 raw XML,需确保表单 enctype 为 text/plain 或用 cy.request() 手动发 POST
  • XML 声明行()若含 BOM 或换行错位,某些解析器会静默失败 —— 建议 fixture 中删掉声明行,改由后端补全

XML 文件上传的坑不在 Cypress API 本身,而在浏览器文件 API 和后端解析器对 MIME 类型、编码、边界符的隐式约定。fixture 加载和 selectFile 包装只是起点,真正关键的是确认整个链路中 XML 字节流没被意外转换或截断。

text=ZqhQzanResources