Mat*_*uza 4 automated-tests cypress
我正在测试 Cypress,我有一个自定义 Cypress 命令的代码:
Cypress.Commands.add('login', (user, password) => {
if (!user || !password) {
user = 'user@test.com.br';
password = '123321';
}
cy.visit('');
cy.contains('Entrar').click();
cy.get('input[name=_username]')
.type(user);
cy.get('input[name=_password]')
.type(password);
cy.get('.btn').click();
});
Run Code Online (Sandbox Code Playgroud)
如果调用cy.login()不带任何参数,user并password在内部分配if块。否则,它使用传递的参数值。
我试图在这里添加装置,并想出了这个代码:
Cypress.Commands.add('login', (user, password) => {
if (!user || !password) {
cy.fixture('users').then((json) => {
var user, password;
user = json[0].email;
password = json[0].password;
login2(user,password);
});
} else {
login2(user, password);
}
function login2(user, password) {
cy.visit('');
cy.contains('Entrar').click();
cy.get('input[name=_username]')
.type(user);
cy.get('input[name=_password]')
.type(password);
cy.get('.btn').click();
}
});
Run Code Online (Sandbox Code Playgroud)
当我设置时user = json[0].email,它的值就在 里面.then,所以我创建了函数 login 来解决这个问题。
我想有更好的方法来做到这一点。有任何想法吗?
赛普拉斯文档提供了使用返回值的指导。最值得注意的是,它建议如下:
返回值
您不能分配或使用任何赛普拉斯命令的返回值。命令被排队并异步运行。
然后文档继续解释Closures的使用,以及.then()块内的嵌套命令。利用cypress/support/commands.js 中的这种方法,您可以像这样简化代码:
Cypress.Commands.add("login", (user, pw) => {
let username;
let password;
cy.fixture('default-user') // <-- fixture in a separate file, default-user.js
.then((defaultUser) => {
username = user || defaultUser.username;
password = pw || defaultUser.password;
cy.get('input[name=_username]').type(username);
cy.get('input[name=_password]').type(password);
cy.get('.btn').click();
});
});
Run Code Online (Sandbox Code Playgroud)
作为参考,default-user.js看起来像这样:
{
username: 'user@test.com.br',
password: '123321'
}
Run Code Online (Sandbox Code Playgroud)
关于别名和共享上下文的赛普拉斯文档有助于理解在不同赛普拉斯上下文和用例中引用值的细微差别。