Cypress测试时if条件成立else块仍执行报错如何解决?
问题根因
- Cypress命令返回值不符合判断逻辑:所有Cypress API(包括
cy.wrap()、.should())返回的都是Cypress链式调用对象,不是布尔值,这类对象在if判断中始终为truthy,因此你写的第一个if条件永远会判定为成立。 - 语法编写错误:你在
else后直接拼接了(cy.wrap($checkListIcon).should('have.attr', 'src', '/Client/images/iconYes.png'))表达式,没有加if关键字,实际执行逻辑为:else分支先执行一遍src为yes的断言,后续的大括号属于独立代码块,无论if/else分支走哪个,这段代码都会执行,最终触发断言报错。
正确实现方案
直接读取原生JQuery元素的src属性做判断即可,不要将Cypress命令作为if的判断条件:
cy.get('.eligibilitySuccessfulGrant > :nth-child(1) > .cursor') .then(($checkListIcon) => { // 读取原生元素的src属性 const iconSrc = $checkListIcon.attr('src') // 兼容浏览器自动补全域名的情况,也可以用 iconSrc.includes('iconNo.png') 做判断 if (iconSrc === '/Client/images/iconNo.png') { verifyQIAPTab.clickRequestOrientation().should('be.disabled') } else if (iconSrc === '/Client/images/iconYes.png') { verifyQIAPTab.clickRequestOrientation().should('be.enabled').click() } else { // 可选:抛出异常提示非预期的src值,方便排查问题 throw new Error(`出现未预期的图标src:${iconSrc}`) } })
如果你的测试场景可以提前确定当前应该出现哪类图标,建议直接拆分测试用例,不需要做动态判断,测试逻辑会更清晰:
- 触发iconNo.png出现的业务场景,直接断言按钮为禁用状态
- 触发iconYes.png出现的业务场景,直接断言按钮为启用状态并执行点击操作
内容的提问来源于stack exchange,提问作者shreyas
相关产品推荐
相关产品推荐

