如何将cy.wait()中产生的内容传递给变量并在接下来的步骤中重用它?



我使用cy.intercept()和cy.wait()来监听请求并从中生成内容。

let number;
describe("some test", () => {
before(() => {
cy.clearCookies();
});
it("some test", () => {
cy.someCommand();
clientPage.someMethod();
cy.intercept("**/request").as("idNumber");
clientPage.someMethod1();
cy.wait("@idNumber").then((res) => {
number = res.response.body.numbers.id
});
cy.get(#someELement).type(number)
});
});

它给了我"cy.type()只能接受字符串或数字。您传入了:undefined"当我尝试在"number = res.response.body.numbers.id"下记录cyy .log(number)时它的工作原理。当我试着通过变量的代码块是未定义的。我怎样才能把它传递到下一步呢?

要确保number的值传递给type,您必须添加then,如:

let number
describe('some test', () => {
before(() => {
cy.clearCookies()
})
it('some test', () => {
cy.someCommand()
clientPage.someMethod()
cy.intercept('**/request').as('idNumber')
clientPage.someMethod1()
cy.wait('@idNumber')
.then((res) => {
number = res.response.body.numbers.id
})
.then(() => {
cy.get('#someELement').type(number)
})
})
})

如果您希望在整个项目中全局使用该变量,您可以使用Cypress.env()方法。柏树Docs .

describe('some test', () => {
before(() => {
cy.clearCookies()
})
it('some test', () => {
cy.someCommand()
clientPage.someMethod()
cy.intercept('**/request').as('idNumber')
clientPage.someMethod1()
cy.wait('@idNumber').then((res) => {
cypress.env('number', res.response.body.numbers.id) //Sets Number
})
cy.get('#someELement').type(Cypress.env('number')) //Gets Number and types it
})
it('some different test', () => {
cy.get('#someELement').type(Cypress.env('number')) //types the number
})
})

@alex-izbas的答案很好,如果你需要立即使用。

在您稍后需要在测试中使用它的选项中,您需要将其设置为.alias(),并将其与function(){}this关键字结合使用。

describe("some test", () => {
before(() => {
cy.clearCookies();
});
// use function() {} to be able to use this keyword
it("some test", function() {
cy.someCommand();
clientPage.someMethod();
cy.intercept("**/request").as("idNumber");
clientPage.someMethod1();
// use .its() to get the id and store in alias
cy.wait("@idNumber")
.its('response.body.numbers.id')
// add an assertion to check type with .should()
.as('number')
// some more actions
// get alias using this keyword
cy.get(#someELement).type(this.number)
});
});

这是因为cypress的异步特性,并且在调用number的那一刻,它的值还没有被赋值。任何进一步的操作都可以通过wait命令链接,而不会用上下文变量污染您的作用域:

cy.wait("@idNumber").then((res) => {
cy.get(#someELement).type(res.response.body.numbers.id)
});

最新更新