首页 > 解决方案 > 赛普拉斯:将超时设置为自定义命令

问题描述

我有一个自定义命令,我想覆盖 4 秒的默认超时。我尝试在命令的代码和使用它的测试中设置超时,但还没有成功。

Cypress.Commands.add("login", () => {
  Auth.signIn(username, password)
    .then(() => {
        console.log('Programmatically logged in as ' + username);
    })
    .catch(err => console.log('Error when login in: ', err));
})

我尝试了以下操作:

Cypress.Commands.add("login", { timeout : 10000} () => {...}

Cypress.Commands.add("login", () => {
  Auth.signIn(username, password)
    .then(({ timeout : 10000}) => {
        console.log('Programmatically logged in as ' + username);
    })
    .catch(err => console.log('Error when login in: ', err));
})

编辑/更新

我在调用中添加了 async/await,Auth.signIn()这使得执行等待该方法完成,但如果它达到 4 秒默认超时,它会使测试失败。我能做的最好的then就是在login命令中包含所有测试代码。

it('Test that requires login', () => {
    cy.login().then(function (){
        cy.visit('/');
        //...
    });
})

虽然测试等待登录操作完成,但如果在登录之前达到超时,则测试失败。

标签: javascriptcypresse2e-testing

解决方案


我不确定timeout赛普拉斯的自定义命令,但您可以通过将默认参数传递给您的自定义命令来使用解决方法,如下所示:

Cypress.Commands.add("login", (waitTimer = 1000) => {
  Auth.signIn(username, password)
    .then(() => {
        cy.wait(waitTimer);
        console.log('Programmatically logged in as ' + username);
    })
    .catch(err => console.log('Error when login in: ', err));
})

注意:请注意,通过timeouts或任意等待x几秒钟不被认为是好的做法。您应该检查response's status& 断言它返回一个200状态或使用路由别名

例子:

......
.then(response => {
    if (response.status !== 200) {
      cy.log('An error happened while logging in');
    }

推荐阅读