【问题标题】:Cypress: set timeout to custom command赛普拉斯:将超时设置为自定义命令
【发布时间】:2021-03-01 19:01:01
【问题描述】:

我有一个自定义命令,我想覆盖 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));
})

编辑/更新

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

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

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

【问题讨论】:

  • 您需要 10 秒的等待时间吗?
  • 如果您超时的原因是表单完成工作所需的时间,我建议您在后续页面中定位一个关键元素,您需要测试并等待它是可见的。它不是 100% 的完全证明,但在大多数情况下是一种更好的做法。
  • @ManuelAbascal 不完全正确。登录操作需要 3.5 到 8 秒才能完成,这使得测试不稳定,因为当登录在 4 秒超时之前完成时,它会通过,否则不会
  • @RosenMihaylov 感谢您的建议。诀窍是,在应用程序中,当未登录的用户导航到主页时,它会被重定向到 /login 页面,所以我必须在测试开始之前完成登录过程和命令cy.visit
  • @MauriR,在这种情况下,我会在 cy.visit() 之后和测试开始之前使用 cy.get('loginFormElement').should('be.visible')

标签: javascript cypress e2e-testing


【解决方案1】:

我不确定 Cypress 的 custom commands 中的 timeout,但您可以通过将 default param 传递到您的自定义命令中来使用解决方法,如下所示:

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 秒数is not considered good practice。您应该改为检查 response's status 并断言它返回 200 状态或使用 route aliases。

示例:

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

【讨论】:

  • 完全同意,只是作为一个扩展 - 如果它是一个重复的默认参数,我将它放在 cypress.env.json 并从那里收集它
  • @RosenMihaylov 哦,我没想到!是的,将默认参数放在 cypress.env.json 中是个好主意!
  • @ManuelAbascal 感谢您的回答。不幸的是,这并没有解决问题,因为cy.wait(waitTimer) 在登录操作之后执行,我需要等待它完成,而不是之后等待一段时间。在我的测试中,我有cy.login() 命令,然后是cy.visit()。我需要访问命令来等待登录,但它不需要。如果我在命令代码中输入async/await,则等待登录,但如果需要超过 4 秒,则测试失败。
  • @MauriR 您是否尝试过使用路由别名? docs.cypress.io/api/commands/spread.html#Aliased-Routes
  • 您也可以通过cy.request() 登录并声明响应状态。你可以查看这个食谱github.com/cypress-io/cypress-example-recipes/blob/master/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多