赛普拉斯有条件退出赛跑者/测试

时间:2019-06-10 14:04:42

标签: javascript cypress end-to-end

因此,我建立了一个用于多个测试的命令,该命令会查看该页面,如果有提示,则该页面将重定向到另一个页面以处理该提示(在这种情况下,是批准计划)。然后,它还会查看该新页面,如果该页面上有一些文本,则会重定向到主页(问题所在),或者单击按钮批准并重定向到主页,然后继续正常进行测试。 / p>

Cypress.Commands.add('approval_redirect', () => {
  cy.get('body').then(($body) => {
    if ($body.text().includes(
        'You must approve your weekly schedule before starting!'
      )) {
      cy.get('.container a')
        .first()
        .click()
      cy.get('main').then(($main) => {
        if ($main.text().includes('schedule')) {
          cy.get('button')
            .click()
          cy.pause()
        } else {
          cy.get('ul > button')
            .click()
        }
      })
    }
  })
})

现在,如果要转到新页面以验证日程安排,并且没有按钮可以单击它,则返回首页然后暂停。我暂停了一下,因为它随后将继续进行测试,并导致大量失败。

例如,在一项测试中,我有:

it('starts here', function (){
 cy.login()
   .wait(1000)
 cy.approval_redirect()
 cy.get('#Route')
   .click()
   .wait(1000)
})

因此在这种情况下,如果它在未单击按钮后重定向到首页,我希望它完全停止测试。没什么可做的。

有没有办法完全阻止跑步者?如何将其放入测试中以检查命令是否失败?

我以为我可以用以下命令将函数包装起来:

function findFailure(failure,success){cy.get...}

然后我放的不是cy.pause()

failure();
return;

然后在ul>按钮下

success();
return;

然后在测试中我做了:

it('starts here', function (){
 cy.login()
   .wait(1000)
 cy.approval_redirect()
 const failure = function(){
  this.skip()
 }
 const success = function(){
  cy.get('#Route')
    .click()
    .wait(1000)
 }
})

没有错误,测试可以运行,但是现在实际上并没有通过命令。那我该如何有条件地停止柏树测试?

2 个答案:

答案 0 :(得分:0)

这很有趣。我赞扬您的足智多谋,尤其是因为赛普拉斯在conditional testing方面由于其异步特性而拥有强烈的感情。

我最近有一个类似的问题。对我来说,如果有网络活动,在某个点上页面上的任何内容都无法单击,并且吐司会显示“正在加载...”,在网络活动完成并且吐司消失之前,什么也无法做。基本上,我需要页面等待烤面包消失所需的时间,然后再继续(因此进行有条件的测试)。

我所做的是这样的: 在commands.js中:

Cypress.Commands.add('waitForToast', () => {
  cy.get('toast-loading', {timeout: 20000}).should('not.exist');
});

然后使用以下命令在实际的test.spec.js中输入

cy.waitForToast();

这里发生的是赛普拉斯正在暂停测试并寻找吐司,并等待20000毫秒的超时。如果吐司卡住了,则测试将退出/失败。如果烤面包消失了,测试将继续。

到目前为止,使用断言是进行条件测试的最有效方法。如果您正在等待按钮的出现,请使用超时时间较长的断言来等待它。然后,如果未显示,则测试将退出并失败。

在您的情况下,您可以断言是否不回家。

或者

如果您希望测试在没有断言和失败的情况下结束,则可以尝试如下操作:

cy.get('home-page-item`)
   .its('length')
   .then(numberOfItems => {
      if (numberOfItems > 0) {
      DO-NOTHING-ASSERT
      } else {
      CONTINUE-TEST
      }
   });

否则,我认为赛普拉斯没有cy.abortTest()之类的东西,因此您必须使用断言或其他方法来解决其反条件测试方法。

答案 1 :(得分:0)

过了一会儿,我发现我的条件语句出现问题,因为它在寻找提示是否存在,然后转到时间表;然后,如果没有某些文字,则返回首页(暂停/希望中止的位置)或单击按钮,返回首页并完成。我注意到我没有在第一个条件下放入另一个。

我的解决方案是只创建一个包含完整测试所有步骤的函数,并且不禁止单击按钮的重定向/重定向。然后,我将失败的控制台日志放入失败日志中,以了解结束测试的情况。像这样:

cy.log('Schedule not approved, redirected, no published schedule. Test ended.')

这为测试提供了清晰的结束/中断。尽管成功/失败是一件好事。