Cypress中如何断言所有匹配DOM元素的文本均等于指定值$email
Cypress批量校验多个匹配元素文本的实现方案
原逻辑的缺陷很明确:当选择器.asis-mailto-obfuscated-email匹配到多个DOM元素时,直接链式调用invoke('text')只会返回第一个元素的文本内容,因此只能完成单元素校验,无法覆盖全部6个匹配项。
要实现所有匹配元素的文本都等于预设值$email的校验,核心是遍历元素集合逐个断言,保留原有分支判断逻辑的修正代码如下:
cy.get('body').then(($body) => { if ($body.find('.asis-mailto-obfuscated-email').length > 0) { // 遍历所有匹配到的邮箱元素,逐个校验文本值 cy.get('.asis-mailto-obfuscated-email').each(($emailEl) => { cy.wrap($emailEl).invoke('text').should('eq', $email) }) } else if ($body.find(':nth-child(1) > .panel-body').length > 0) { cy.log('It goes here') } })
写法说明
- 用Cypress内置的
.each()方法遍历所有匹配到的元素集合,对每个元素通过cy.wrap()包装为Cypress对象后再取文本断言,只要任意一个元素的文本和$email不一致,测试就会直接抛出断言失败,完全覆盖6个元素的校验需求。 - 你贴出的原始代码末尾多写了一个冗余的
}),运行时会触发语法错误,上面的代码已经同步修正了这个问题。
如果你更习惯批量拿到所有文本后统一校验,也可以用下面的等价写法:
cy.get('.asis-mailto-obfuscated-email').then(($elements) => { // 提取所有元素的文本组成数组 const emailTextList = Cypress.$.map($elements, (el) => el.textContent.trim()) // 校验数组内所有值都等于预设邮箱 expect(emailTextList.every(text => text === $email)).to.be.true })
内容的提问来源于stack exchange,提问作者Noel
相关产品推荐
相关产品推荐

