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

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 中删掉声明行,改由后端补全










