Cypress中如何断言特定文本?断言值2时代码不生效如何解决
Cypress对值2断言失效解决方案
断言失效基本都是以下几个高频原因,对着排查就行:
- 取错了断言对象:直接对
cy.get()返回的结果做相等断言,拿到的是DOM元素集合,不是元素内的实际值/文本,必然匹配失败。
正确写法要先取出目标内容,再做校验:// 校验普通DOM元素的文本值 cy.get('目标元素选择器') .invoke('text') // 取出元素文本 .then(textStr => Number(textStr.trim())) // 去掉首尾空白后转数字 .should('eq', 2) // 校验input/textarea等表单元素的输入值 cy.get('表单元素选择器') .invoke('val') // 取出表单值 .then(inputVal => Number(inputVal)) .should('eq', 2) - 类型不匹配:Cypress从DOM里取出的文本、表单值默认都是字符串类型,直接拿字符串
"2"和数字2做严格相等判断会直接失败,必须手动做显式类型转换,不要依赖JS隐式类型转换,很容易出现奇奇怪怪的匹配问题。 - 内容带隐藏空白:肉眼看到元素显示的是2,实际DOM存储的内容可能带首尾空格、换行符、不可见的特殊字符,取到内容后一定要先加
.trim()处理掉首尾无效字符,再做转换和断言。 - 异步逻辑没处理:Cypress所有命令都是异步排队执行的,如果你把断言写在命令链外面,同步取变量做校验,断言执行时变量还没被赋值,自然不生效。
错误写法示例:// 错误:断言执行时,异步命令还没给num赋值 let num cy.get('.target').invoke('text').then(t => num = Number(t.trim())) expect(num).to.eq(2) // 正确:断言放在命令链回调里,等值取到后再执行 cy.get('.target').invoke('text').then(t => { const num = Number(t.trim()) expect(num).to.eq(2) })

内容的提问来源于stack exchange,提问作者Manish B
相关产品推荐
相关产品推荐

