Cypress捕获选择器文本跨页面使用时报Cannot read错误如何解决
报错原因
该报错和选择器是否正确赋值无关,是两个核心问题导致的:
- Cypress所有命令都是异步入队执行的,你写的同步代码
const txtneeded = this.text_needed运行时,as('text_needed')的别名赋值逻辑还没有执行,此时this上不存在text_needed属性。 - 如果你的测试用例回调使用了箭头函数,Cypress的执行上下文不会绑定到
this上,会直接导致this为undefined,触发你遇到的报错。
解决方法
方法1:在.then()回调中处理变量(最常用,单测试用例内使用推荐)
所有依赖该文本的逻辑都要放在别名获取的.then()回调中,保证异步命令执行完成后再取值:
// 捕获a标签文本并存储为别名 cy.get('a').invoke('text').trim().as('text_needed') // 取值并使用 cy.get('@text_needed').then(textNeeded => { // 所有需要用到textNeeded的逻辑都写在这个回调内 cy.log(textNeeded) // 示例:跳转到搜索页执行筛选 cy.visit('/search-page') cy.get('#search-input').type(textNeeded) cy.get('#submit-search').click() })
注意:调用.trim()是为了移除a标签文本前后可能存在的多余空白,保证拿到的是纯净的PO90944值
方法2:跨测试用例共享变量
如果需要在多个it测试用例中使用该文本,需要使用普通函数作为用例回调,保证this上下文可以正常绑定:
describe('订单搜索测试', () => { // 前置操作捕获文本,存储为全局别名 before(function() { cy.get('a').invoke('text').trim().as('text_needed') }) // 注意:用例回调使用普通function,不能用箭头函数 it('打印获取到的订单号', function() { cy.log(this.text_needed) }) it('搜索对应订单', function() { cy.visit('/search-page') cy.get('#search-input').type(this.text_needed) cy.get('#submit-search').click() // 后续校验逻辑 }) })
内容的提问来源于stack exchange,提问作者Lohann Botha
相关产品推荐
相关产品推荐

