Cypress/TypeScript中传入的变量参数为何不显示已赋值?
问题根源分析
问题其实出在Cypress命令的参数求值逻辑上:
cy.contains(wireTitle)里的wireTitle是在这条命令被加入Cypress执行队列时就直接取了当前值——也就是你初始化的空字符串,根本不会等到前面的赋值逻辑完成后再取值。- 步骤3的
console.log(wireTitle)是在cy.get().then()的回调里执行的,属于Cypress异步队列里的后续操作,此时赋值已经完成,所以能打印出正确值,但这和步骤4的参数求值时机完全没关系。
解决方案
给你几个靠谱的写法:
1. 把断言嵌套到赋值的回调里
直接把依赖wireTitle的断言放到赋值完成的回调里,确保变量有值后再执行断言:
//Step 1: Declares variable let wireTitle: string = "" //..test case goes on..// //Step 2: 赋值同时执行断言 cy.get("ol li").first().then((element) => { wireTitle = element.find('.prelead-title').text() // 在这里执行断言,确保wireTitle已赋值 cy.get("div.prelead-modal-component").contains(wireTitle) }) //Step 3: 打印结果(也可以放到上面的回调里) cy.get("ol li").then(() => {console.log(wireTitle)})
2. 用Cypress别名存值(更符合最佳实践)
利用Cypress的别名机制传递异步获取的值,避免外部变量的问题:
//..test case goes on..// //Step 2: 把文本值存为别名 cy.get("ol li").first().find('.prelead-title').invoke('text').as('wireTitle') //Step 3: 通过别名取值打印 cy.get('@wireTitle').then((wireTitle) => { console.log(wireTitle) }) //Step 4: 通过别名执行断言 cy.get("div.prelead-modal-component").contains(function() { return this.wireTitle })
3. 在contains里用回调延迟取值
用回调函数代替直接传变量,让Cypress在执行断言时才去取wireTitle的最新值:
//Step 1: Declares variable let wireTitle: string = "" //..test case goes on..// //Step 2: Assigns value to the variable cy.get("ol li").first().then((element) => { wireTitle = element.find('.prelead-title').text() }) //Step 3: Logs the result cy.get("ol li").then(() => {console.log(wireTitle)}) //Step 4: 用回调函数动态取值 cy.get("div.prelead-modal-component").contains(() => wireTitle)
补充说明
你之前试的强制等待、多次加then都没用,是因为这些操作没改变cy.contains(wireTitle)的参数求值时机——只要直接传变量,就会在命令入队时同步拿值,和后续的异步赋值完全脱节。
内容的提问来源于stack exchange,提问作者Lukaszesque
相关产品推荐
相关产品推荐

