【问题标题】:Failed expect inside browser.call() method doesn't fail test在 browser.call() 方法中失败的期望不会失败测试
【发布时间】:2020-11-02 15:46:10
【问题描述】:

我在与 mocha 和 devtools-service 同步模式下使用 WebdriverIO

//package.json

    "dependencies": {
    "@babel/cli": "^7.11.6",
    "@babel/core": "^7.11.6",
    "@babel/plugin-proposal-class-properties": "^7.10.4",
    "@babel/preset-env": "^7.11.5",
    "@babel/register": "^7.11.5",
    "@wdio/allure-reporter": "^6.6.0",
    "@wdio/cli": "^6.6.0",
    "@wdio/devtools-service": "^6.6.0",
    "@wdio/junit-reporter": "^6.6.0",
    "@wdio/local-runner": "^6.6.0",
    "@wdio/mocha-framework": "^6.6.0",
    "@wdio/spec-reporter": "^6.6.0",
    "@wdio/sync": "^6.6.0",
    "chai": "^4.2.0",
    "chromedriver": "^86.0.0",
    "moment": "^2.29.1",
    "wdio-chromedriver-service": "^6.0.4"
  },

在其中一项测试中,我有以下应该打开 url 的代码,检查 API 响应是否为 500 并等待一些 UI 元素出现:

      const puppeteer = browser.getPuppeteer();
      const page = browser.call(() => puppeteer.pages())[0];
      browser.call(() =>
          page.on('response', response => {
             expect(response.status()).not.toEqual(500);
          })
      );
     browser.call(() => page.goto(item.url, { waitUntil: 'networkidle0' }));
     browser.call(() => page.waitForSelector('div.headline'));

问题是当我运行这个测试并出现错误 500 时,我可以在日志中看到 expect 失败了,但测试本身并没有失败。

这是控制台输出的一部分,清楚地表明期望失败:

[0-0] (node:14952) UnhandledPromiseRejectionWarning: Error: expect(received).not.toEqual(expected) // deep equality

Expected: not 500

    at d:\Robocze\bos-frontend-tests\healthcheck\/healthcheck.gen.js:50:55
    at D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\vendor\mitt\src\index.js:51:62
    at Array.map (<anonymous>)
    at Object.emit (D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\vendor\mitt\src\index.js:51:43)
    at Page.emit (D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\puppeteer\common\EventEmitter.js:72:22)
    at D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\puppeteer\common\Page.js:165:101
    at D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\vendor\mitt\src\index.js:51:62
    at Array.map (<anonymous>)
    at Object.emit (D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\vendor\mitt\src\index.js:51:43)
    at NetworkManager.emit (D:\Robocze\bos-frontend-tests\node_modules\puppeteer-core\lib\cjs\puppeteer\common\EventEmitter.js:72:22)

以及测试总结:

 "spec" Reporter:
------------------------------------------------------------------
[chrome 86.0.4240.111 windows #0-0] Spec: d:\Robocze\bos-frontend-tests\healthcheck\healthcheck.gen.js
[chrome 86.0.4240.111 windows #0-0] Running: chrome (v86.0.4240.111) on windows
[chrome 86.0.4240.111 windows #0-0] Session ID: 99e20f03ca9b29678d70c8293aa176d2
[chrome 86.0.4240.111 windows #0-0]
[chrome 86.0.4240.111 windows #0-0] Health check tests generator
[chrome 86.0.4240.111 windows #0-0]    ✓ get all menus
[chrome 86.0.4240.111 windows #0-0]    ✓ perform healthcheck
[chrome 86.0.4240.111 windows #0-0]
[chrome 86.0.4240.111 windows #0-0] 2 passing (13m 38.2s)


Spec Files:      1 passed, 1 total (100% completed) in 00:13:47

所以我的问题是为什么失败的期望没有通过测试(准确地说是执行健康检查测试),我该如何解决?

【问题讨论】:

    标签: javascript puppeteer webdriver-io


    【解决方案1】:

    正如错误所说,您应该先等待响应,然后再断言它。

    我建议将https://webdriver.io/docs/api/browser/mock.htmlhttps://webdriver.io/docs/api/expect-webdriverio.html#toberequestedwith 结合使用

    特别适合这种情况,甚至不需要 devtools 服务器。

    回到你的代码,这是处理事件的 JS 基础

    const r = await new Promise(resolve => page.on('response', resolve)) 期望(r.status()).not.toEqual(500)

    附: 注意到与 Puppeteer 的大量交互,也许您的意图是使用 devtools 自动化协议而不是 https://webdriver.io/docs/automationProtocols.html#devtools-protocol

    【讨论】:

    • 这实际上是我在整个解决方案中使用 Puppeteer 的唯一地方。您的解决方案听起来有点复杂。我所做的解决方法只是将状态代码为 500 的响应推送到数组,这在整个测试结束时得到了验证,我可以轻松地使用期望失败测试:)
    • 好吧,我已经描述了它应该如何理想地工作,并为您的自定义代码提供了修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多