因此,我尝试使用自定义命令来减少在多个文件中写入同一内容的需要。具体来说,这是用于通过JWT登录并设置令牌。
这是当前的工作代码(从cypress示例的JWT登录示例中借用):
let user;
before(function() {
cy.request("POST", Cypress.env("auth_url"), {
username: Cypress.env("auth_username"),
password: Cypress.env("auth_password")
})
.its("body")
.then(res => {
user = res;
});
});
beforeEach(function() {
console.log(cy.get_auth_token)
cy.visit("/", {
onBeforeLoad(win) {
// set the user object in local storage
win.localStorage.setItem("token", user.token);
}
});
});
所以我试图通过以下方式做类似的事情:
Cypress.Commands.add("get_auth_token", () => {
let user;
cy.request("POST", Cypress.env("auth_url"), {
username: Cypress.env("auth_username"),
password: Cypress.env("auth_password")
})
.its("body")
.then(res => {
user = res;
});
return user;
})
但是,当我尝试在beforeEach
函数中以let user = cy.get_auth_token
的形式调用它时,会收到有关用户未定义的错误。我在返回值时做错了什么吗?我不是诺言方面的专家...但是,这似乎应该起作用吗?
谢谢!
答案 0 :(得分:1)
尝试将您的代码放入Promise并解析“用户”。使用Cypress.Promise,它将等待直到用户返回:
Cypress.Commands.add("get_auth_token", () => {
return new Cypress.Promise((resolve, reject) => {
cy.request("POST", Cypress.env("auth_url"), {
username: Cypress.env("auth_username"),
password: Cypress.env("auth_password")
})
.its("body")
.then(user => {
resolve(user);
});
})
})
答案 1 :(得分:1)
命令与函数不同,返回值不可分配给局部变量。相反,他们将其“屈服”到链中的下一个命令,该命令可以是then()
。同样,该值是一个“主题”,它是返回值的jQuery包装版本。
简而言之,这应该是您使用自定义命令的方式:
beforeEach(function() {
cy.get_auth_token().then($user => {
console.log($user[0]);
cy.visit("/", {
onBeforeLoad(win) {
// set the user object in local storage
win.localStorage.setItem("token", $user[0].token);
}
});
});
});