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") }) })
执行结果
输出如下所示 −
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') }) })