使用Cypress.io开展E2E测试时文件上传API路径异常导致404的问题求助
Cypress 文件上传API路径缺失导致404的解决方案
问题复现情况
- 被测门户系统的文件上传功能手动操作完全正常,手动触发的有效API请求为:
POST 200 /etl/v1.0.0/datauploaderetl/spaces/etl_jyddc0tx/data-files - 使用Cypress自动化触发上传时,实际发出的请求路径为:
POST 404 /etl/v1.0.0/datauploaderetl/data-files - 路径差异:缺失
/spaces/etl_jyddc0tx空间标识段,直接触发接口404错误、上传流程中断 - 已补充上传完成态的等待逻辑,问题仍未解决
- 现有测试代码片段:
cy.fixture(fileName1).then(fileContent => { cy.get('input[type="file"]').attachFile({ fileContent: fileContent.toString(), fileName: fileName1, mimeType: fileType }) }); cy.waitUntil(() => cy.get(":nth-child(98) > .modal > .modal-lg > .modal-content > .modal-body") .should('contain.text', 'Status: completed') );
- 上传完成的弹窗状态可参考对应截图:

根因与解决步骤
- 补全手动操作的前置链路
缺失的空间路径段,是前端在发起上传请求前,从当前页面选中状态/路由参数中读取的空间标识。手动操作时,用户会先选中目标空间etl_jyddc0tx,前端会将该标识存入全局上下文,拼接请求路径时自动追加到URL中。如果测试流程跳步,没有执行「选中目标空间」的操作,前端读不到空间标识,就会生成缺失该段的错误请求路径。
操作要求:在执行文件上传前,完整复现手动操作流程——进入空间列表、选中ID为etl_jyddc0tx的目标空间、等待空间信息加载完成,确认页面已展示当前选中的空间标识后,再触发上传操作。 - 调整等待逻辑的触发时机
当前的等待逻辑在attachFile执行完成后才启动,存在时序漏洞:文件选择触发change事件后,前端拼接请求URL的逻辑是快速同步执行的,如果attachFile触发事件时,前端还未完成空间标识的读取、上传组件初始化,就会用空值生成不完整的请求路径。
调整要求:在attachFile操作前就校验前置状态就绪,调整后的代码示例:// 先确认当前选中的空间为目标空间 cy.get('[data-testid="current-space-tag"]').should('contain', 'etl_jyddc0tx') // 确认上传输入框已初始化完成、可正常接收文件 cy.get('input[type="file"]').should('be.visible').and('not.be.disabled') // 状态确认完成后再执行文件选择逻辑 cy.fixture(fileName1).then(fileContent => { cy.get('input[type="file"]').attachFile({ fileContent: fileContent.toString(), fileName: fileName1, mimeType: fileType }) }); // 保留原有上传完成后的等待逻辑 cy.waitUntil(() => cy.get('.modal .modal-content .modal-body') .should('contain.text', 'Status: completed') ); - 替换高脆弱性的DOM选择器
现有代码中使用的:nth-child(98)这类基于DOM位置的选择器鲁棒性极差,只要页面结构微调,就会导致等待逻辑判断失效。优先使用页面内置的测试ID、稳定的文案标识作为选择器,减少对DOM层级结构的依赖。 - 校验测试入口的路由参数
如果测试是通过cy.visit()直接进入上传页面,需要确认访问URL是否携带了正确的空间参数。正常链路的上传页地址会附带类似?spaceId=etl_jyddc0tx的参数,如果直接访问无参数的上传页,前端读不到空间ID,也会生成缺失空间段的错误请求。
内容的提问来源于stack exchange,提问作者Suyash Nande
相关产品推荐
相关产品推荐

