Cypress - 异步行为

Cypress 源自基于 JavaScript 的 node.js。Cypress 命令本质上是同步的,因为它们依赖于节点服务器。异步流程意味着测试步骤不依赖于其先前的步骤来执行。

没有依赖关系,每个步骤都作为独立身份执行。尽管测试步骤是按顺序排列的,但单个测试步骤不会考虑前一步的结果,而只是简单地执行自身。

示例

以下是 Cypress 中异步行为的示例 −

// 测试套件
describe('Tutorialspoint', function () {
    it('Scenario 1', function (){
    // 启动 URL 的测试步骤
    cy.visit("https://accounts.google.com")
    // 识别元素
    cy.get('h1#headingText').find('span').should('have.text', 'Sign in')
    cy.get('h1#headingText').find('span').then(function(e){
        const t = e.text()
        // 获取控制台
        console.log(t)
        })
        // 控制台消息
        console.log("Tutorialspoint-Cypress")
    })
})

执行结果

输出如下所示 −

Asynchronous Behavior in Cypress

Promise

右键单击 Test Runner 并单击 Inspect,我们可以在控制台中验证结果。这里,Tutorialspoint-Cypress(较早的步骤)在 Sign – in(稍后添加的步骤)之前记录在控制台中。

Cypress 命令的设计方式是每个步骤都按顺序执行,并且不会同时触发。但是,它们一个接一个地排列。因此,它使流程同步。这是通过 Promise 实现的。

在上面的例子中,console.log 是一个纯 JavaScript 语句。它不具备与 Cypress 命令类似的排队等待功能。Promise 允许我们以串行模式执行 Cypress 命令。

Promise 中的模式

Promise 有三种模式来对命令执行的状态进行分类。它们如下 −

  • 已解决 − 如果测试步骤成功运行,则会出现此结果。

  • 待处理 − 如果正在等待测试步骤运行结果,则会出现此结果。

  • 已拒绝 − 如果测试步骤运行失败,则会出现此结果。

仅当前一个步骤已成功执行或收到已解决的承诺响应时,才会执行 Cypress 命令。然后使用该方法在 Cypress 中实现 Promise。

示例

以下是 Cypress 中 Promise 的示例 −

describe('Tutorialspoint Test', function () {
   it('Promise', function (){
      return cy.visit('https://accounts.google.com')
      .then(() => {
         return cy.get('h1#heading');
      })
   })
})

Cypress 的 Promise 实现是封装的,不可见。因此,它有助于获得更紧凑的代码。此外,在自动化测试时,我们不必考虑 Promise 的状态。

不使用 Promise 的实现

以下命令解释了如何在 Cypress 中不使用 Promise 实现 −

describe('Tutorialspoint Test', function () {
   it('Without Promise', function (){
      cy.visit('https://accounts.google.com')
      cy.get('h1#heading')
   })
})