javascript - 在自定义助手中处理断言

标签 javascript nightmare codeceptjs

我已经开始使用 CodeceptJs,而且我已经很容易地让它工作了。我目前正在将它与 NightmareJs 一起使用,一切似乎都很好。

我正在测试的特定区域是一个画廊,它通过 JSONP 从接口(interface)获取数据,创建一个包含在 <div> 中的图像列表。 s。

我正在实现的部分测试如下:

Feature('gallery')
Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeElement('#gallery .col-md-3')
  I.click('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

现在,由于元素可以是任意数字,因此它当前正在默默地使用第一个元素,但为了给它更多的熵,我想随机选择一个元素,如下所示

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  I.clickOnRandomElement('#gallery .col-md-3')
  I.seeElement('#gallery .selected')
})

或者更好的是,如果我可以获取元素列表,以便我可以决定单击哪个元素,例如:

Scenario('clicking on an element adds "selected" class', (I) => {
  I.amOnPage('/')
  I.seeMoreThanElements('#gallery .col-md-3', 1)
  const elements = I.grabRandomElement('#gallery .col-md-3')
  const random = getRandomInt(1, elements.length)
  I.click(`#gallery .col-md-3:nth-child(${random})`)
  I.seeElement(`#gallery .col-md-3.selected:nth-child(${random})`)
})

当前可用的帮助程序不允许我执行某些特定操作,因此我开始实现自定义处理程序,如 http://codecept.io/helpers/ 指南中所述。

在我的配置中,我有以下内容:

"helpers": {
  "Nightmare": {
    "url": "http://localhost:3000"
  },
  "DOMElements": {
    "require": "./__tests__/helpers/domelements_helper.js"
  }
}

domelements_helper.js目前看起来如下:

'use strict'
let assert = require('assert')

class DOMElements extends Helper {
  seeMoreThanElements (locator, count) {
    this.helpers['Nightmare']._locate(locator).then(function (els) {
      return assert(els.length >= count, `Found more than ${count} elements`)
    })
  }
}

module.exports = DOMElements

这显然不起作用。这就是我有点困惑的地方。

首先,我使用默认的 Node.js 断言库,如果有任何需要,我很乐意转向更强大的库,例如 Protractor 或 Chai-as-promised,但越精简越好。

其次,文档明确说明了以下内容:

any helper method should return a value in order to be added to promise chain

这确实没有意义......我应该返回一个 promise 还是应该在 then() 内处理整个事情陈述?因为返回一个基本值并没有多大作用。即使如此,我如何处理失败的断言?

我还在代码库中看到了 Nightmare 客户端脚本,但我不知道它对我的情况是否有任何用处,因为我刚刚开始挖掘代码库,以便更好地理解如何自定义和扩展 CodeceptJs。

非常感谢任何指点

最佳答案

由于似乎没有人做到这一点,因此我将添加一个答案,因为我似乎已经通过浏览代码库找到了这个东西的工作原理并更多地了解它是如何工作的。

tl;dr:快速解决方案如下:

/* __tests__/helpers/domelements_helper.js */
const assert = require('assert')

class DOMElements extends Helper {

  seeMoreThanElements (locator, count) {
    return this.helpers['Nightmare']._locate(locator)
      .then((elementsArray) => {
        if (elementsArray.length < count) {
          return assert.fail(elementsArray.length, count, `Found more than ${count} elements`)
        }
      })
  }
}

module.exports = DOMElements

整个事情的运作方式是通过 promise ,你必须适本地处理失败,以便整个系统可以优雅地失败(某种程度)。

特别是 _locate() 返回一个 promise ,所有事情都必须异步处理,尽管从设计上来说,这似乎很尴尬,并且使得事情特别难以实现,至少在当前状态下是如此.

关于javascript - 在自定义助手中处理断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42227662/

相关文章:

javascript - 使用 jQuery 从特定单元格中选择数据

javascript - .position() 不指向容器

javascript - Vee-Validate 仅验证一个字段

selenium-chromedriver - 如何使用 Playwright 更改默认语言 Chromium/Firefox?

node.js - Vagrant 上的nightmareJS超时

automated-tests - 无法在 headless chrome 中运行我的 CodeceptJS 测试用例

javascript - 如何根据 div 内容切换 div 的可见性

javascript - PhantomJS 传递参数来评估

javascript - 从 Nightmare.js 返回 HTML 正文

node.js - Nightmarejs 会被检测为机器人吗?