我使用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)
});