Javascript 存储一个元素';将Cypress中的文本置于链接器方法之外
如何存储一次div的文本值并在整个cypress测试中使用它 到目前为止,我通过将测试的大部分逻辑嵌套在then方法的调用中实现了这一点,但这似乎并不优雅或理想Javascript 存储一个元素';将Cypress中的文本置于链接器方法之外,javascript,cypress,Javascript,Cypress,如何存储一次div的文本值并在整个cypress测试中使用它 到目前为止,我通过将测试的大部分逻辑嵌套在then方法的调用中实现了这一点,但这似乎并不优雅或理想 cy.get('div').then(($div) => { let storedVar = $div.text() // Bulk of dependent test logic gets nested here }) 我尝试将文本存储在then方法之外,如下所示: let storedVar = '' cy
cy.get('div').then(($div) => {
let storedVar = $div.text()
// Bulk of dependent test logic gets nested here
})
我尝试将文本存储在then方法之外,如下所示:
let storedVar = ''
cy.get('div').then($div => {storedVar=$div.text()})
但这不起作用(因为这是一个承诺,storedVar在整个测试过程中保持其初始值)
是否有此嵌套解决方案的替代方案?您的代码将无法工作,因为您没有在链中执行操作。 Cypress在promise chain中工作,这就是架构。。。。您必须将值传递给chain并相应地执行操作 它的工作原理如下
return cy.get(`.locatorClassName`).then(ele => {
return ele.text()
}).then(eleValue => {
cy.log(eleValue);
});
您的代码将无法工作,因为您没有在链中执行操作。 Cypress在promise chain中工作,这就是架构。。。。您必须将值传递给chain并相应地执行操作 它的工作原理如下
return cy.get(`.locatorClassName`).then(ele => {
return ele.text()
}).then(eleValue => {
cy.log(eleValue);
});
在cypress中存储值时,需要使用别名,因为cypress的异步性质
const value=cy.get('div')。text()
不会提供预期的输出
it("test",function (){
cy.get('div').invoke('text').as('value')
//this is wrong
cy.log(this.value)
})
您需要使用别名来实现所需的功能。但是正如您在问题中所提到的,如果要在创建别名的同一测试用例中使用别名,则需要使用。然后使用。因为正如我前面提到的,cypress执行是异步的,所以如果使用下面提到的别名,它将不会提供预期的输出
it("test",function (){
cy.get('div').invoke('text').as('value')
//this is wrong
cy.log(this.value)
})
正确的方法是
it("test",function (){
cy.get('div').invoke('text').as('value').then(() => {
cy.log(this.value)
})
})
要记住的第二件事是,当您在编写钩子时使用别名时,如果您希望使用以前创建的别名,则不要使用箭头函数。所以it(“test”,()=>{})将不起作用,但it(“test”,function(){})将起作用
根据你的问题,你可以用这样的别名
例如:
//Lets create aliases in test01, test02 and test03
before("test01",() => {
cy.get('div').invoke('text').as('var1');
})
it("test02",() => {
cy.get('div').then($el => {
cy.wrap($el.text()).as('val2')
})
})
it("test03",() => {
cy.get('div').invoke('text').as('var3')
})
//let's create use those created aliases in another test
//remember - NO arrow functions to create hooks when using aliases
it("test04", function(){
const variable = this.var3
cy.log(this.var1)
cy.log(this.var2)
cy.log(variable)
//All the above commands will log the expected innerText values
})
希望这就是您想要的。在cypress中存储值时,您需要使用别名,因为cypress的异步性质const value=cy.get('div')。text()
不会提供您期望的输出
it("test",function (){
cy.get('div').invoke('text').as('value')
//this is wrong
cy.log(this.value)
})
您需要使用别名来实现所需的功能。但是正如您在问题中所提到的,如果要在创建别名的同一测试用例中使用别名,则需要使用。然后使用。因为正如我前面提到的,cypress执行是异步的,所以如果使用下面提到的别名,它将不会提供预期的输出
it("test",function (){
cy.get('div').invoke('text').as('value')
//this is wrong
cy.log(this.value)
})
正确的方法是
it("test",function (){
cy.get('div').invoke('text').as('value').then(() => {
cy.log(this.value)
})
})
要记住的第二件事是,当您在编写钩子时使用别名时,如果您希望使用以前创建的别名,则不要使用箭头函数。所以it(“test”,()=>{})将不起作用,但it(“test”,function(){})将起作用
根据你的问题,你可以用这样的别名
例如:
//Lets create aliases in test01, test02 and test03
before("test01",() => {
cy.get('div').invoke('text').as('var1');
})
it("test02",() => {
cy.get('div').then($el => {
cy.wrap($el.text()).as('val2')
})
})
it("test03",() => {
cy.get('div').invoke('text').as('var3')
})
//let's create use those created aliases in another test
//remember - NO arrow functions to create hooks when using aliases
it("test04", function(){
const variable = this.var3
cy.log(this.var1)
cy.log(this.var2)
cy.log(variable)
//All the above commands will log the expected innerText values
})
希望这就是您要找的。您好,接受的答案有效吗?我知道你不能在cypress中返回值。但你需要的是使用别名。(如果你想在下面的测试用例中使用一个值)。@mudithapera答案仍然要求我链接值,所以不是真的。别名听起来更正确,这就是为什么我想知道,因为react不适用于return语句。我将添加另一个答案,因为我无法在此提供清晰的解释嗨,接受的答案有效吗?我知道你不能在cypress中返回值。但你需要的是使用别名。(如果你想在下面的测试用例中使用一个值)。@mudithapera答案仍然要求我链接值,所以不是真的。别名听起来更正确,这就是为什么我想知道,因为react不适用于return语句。我将补充另一个答案,因为我不能在这里提供一个明确的解释