Cypress使用cy.readFile读取JSON值后断言失败该如何解决?
问题根因
- Cypress 所有以
cy开头的命令都是异步入队执行的,你的同步断言代码会先于cy.readFile的回调逻辑执行,执行cy.get断言时,expectedTimeOfTest还停留在初始赋值的空字符串,因此触发空值报错。 - 额外的
JSON.stringify操作会给目标值包裹多余的双引号,就算拿到正确值也会和元素原始文本不匹配。
修复方案
方案1:将断言移入异步回调
直接把断言逻辑放到cy.readFile的then回调中,保证读取到文件值之后再执行断言,同时删除不必要的JSON.stringify:
cy.readFile(filePath + fileName).then((json) => { expect(json).to.be.an('object') const expectedTimeOfTest = json.SEQUENCE.timeoftest; cy.log(">>" + expectedTimeOfTest); // 断言放在回调内部,确保取值完成后执行 cy.get('.testClass').eq(1).should('have.text', expectedTimeOfTest); });
方案2:用别名存储值避免回调嵌套
如果后续多个地方需要用到文件值,可以用Cypress的别名机制存储,避免多层回调嵌套:
// 读取文件后将数据存为别名 cy.readFile(filePath + fileName).as('testJsonData'); // 需要取值时通过别名获取 cy.get('@testJsonData').then((json) => { const expectedTimeOfTest = json.SEQUENCE.timeoftest; cy.get('.testClass').eq(1).should('have.text', expectedTimeOfTest); })
额外注意
如果目标元素的文本前后存在空白字符,可以将断言改为should('have.trim.text', expectedTimeOfTest),或者用should('contain', expectedTimeOfTest)做模糊匹配,避免空格导致的断言失败。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

