清理量角器堆栈跟踪

时间:2015-12-02 17:38:50

标签: javascript selenium jasmine protractor end-to-end

问题:

是否可以清理堆栈跟踪并仅保留相关的框架,从而消除所有ProtractorWebDriverJSJasmine特定的内容?

故事:

让我们执行此示例测试:

describe("SO test", function () {
    beforeEach(function () {
        browser.get("https://angularjs.org");
    });

    it("should throw a meaningful error", function () {
        element(by.id("not_found")).click();
    });
});

以下堆栈跟踪会失败:

SO test should throw a meaningful error
  - Failed: No element found using locator: By.id("not_found")
      at new bot.Error (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/atoms/error.js:108:18)
      at /usr/local/lib/node_modules/protractor/lib/element.js:676:15
      at [object Object].promise.Promise.goog.defineClass.invokeCallback_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1337:14)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21)
      at goog.async.run.processWorkQueue (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/async/run.js:124:15)
      at process._tickCallback (node.js:377:9)
  Error
      at [object Object].ElementArrayFinder.applyAction_ (/usr/local/lib/node_modules/protractor/lib/element.js:382:21)
      at [object Object].ElementArrayFinder.(anonymous function) [as click] (/usr/local/lib/node_modules/protractor/lib/element.js:78:17)
      at [object Object].ElementFinder.(anonymous function) [as click] (/usr/local/lib/node_modules/protractor/lib/element.js:711:7)
      at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:9:37)
      at /usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:96:23
      at [object Object].promise.Promise.goog.defineClass.constructor (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1056:7)
      at new wrappedCtr (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/base.js:2468:26)
      at controlFlowExecute (/usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:82:18)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21)
  From: Task: Run it("should throw a meaningful error") in control flow
      at Object.<anonymous> (/usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:81:14)
      at /usr/local/lib/node_modules/protractor/node_modules/jasminewd2/index.js:18:5
      at [object Object].promise.Promise.goog.defineClass.invokeCallback_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:1337:14)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_.execute_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2776:14)
      at [object Object].promise.ControlFlow.goog.defineClass.goog.defineClass.abort_.error.executeNext_ (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/../webdriver/promise.js:2758:21)
      at goog.async.run.processWorkQueue (/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/goog/async/run.js:124:15)
  From asynchronous test: 
  Error
      at Suite.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:8:5)
      at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:3:1)
      at Module._compile (module.js:425:26)
      at Object.Module._extensions..js (module.js:432:10)
      at Module.load (module.js:356:32)

正如您所看到的,在测试错误实际发生的哪一行上并不容易找到。它隐藏在由ProtractorWebDriverJSJasmine堆栈帧覆盖的堆栈跟踪内的某个位置。这使得调试和开发端到端测试变得困难。

期望的输出:

SO test should throw a meaningful error
  - Failed: No element found using locator: By.id("not_found")
      at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:9:37)
  From asynchronous test: 
  Error
      at Suite.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:8:5)
      at Object.<anonymous> (/Users/user/job/project/test/e2e/specs/test.spec.js:3:1)
      at Module._compile (module.js:425:26)
      at Object.Module._extensions..js (module.js:432:10)
      at Module.load (module.js:356:32)
      at Function.Module._load (module.js:311:12)

使用protractor 3.0.0和jasmine2

mocha世界中,有一个相关的mocha-clean软件包会过滤掉来自node_modulesmocha内部的所有内容,从而留下易于阅读的干净堆栈跟踪

4 个答案:

答案 0 :(得分:3)

事实证明,如果您使用任何自定义报告器,它们可能会引入控制堆栈跟踪输出的新行为。 Protractor本身隐藏了很多东西,所以你不会看到来自node_modules或Jasmine的任何日志条目。

当您使用jasmine-spec-reporter(提供控制堆栈跟踪的选项)时,您可能已经在选项中设置了一些详细模式。在docs for Protractor由于某种原因,建议使用all模式,它基本上显示enitre堆栈跟踪。

    onPrepare: function () {
    jasmine.getEnv().addReporter(new SpecReporter({
      spec: {
        displayStacktrace: true
      }
    }));

如果您只是将选项displayStacktraceall更改为none,那么您应该获得干净的结果,而不会有任何堆栈跟踪。还有选项summaryspecs。您可能没有注意到它们之间的区别,但如果您在套件中添加了更多规格,那么您将能够看到差异:

  1. specs - 如果规范在运行测试过程中失败,您会在规范失败消息后立即看到它的堆栈跟踪
  2. summary - 如果规范在运行测试过程中失败,您将在规范失败消息后立即查看堆栈跟踪,但您将获得一个列表在所有测试结束时失败规格的所有堆栈跟踪
  3. all - 结合specssummary - 如果规范在运行测试过程中失败,您会在规范失败消息后立即看到堆栈跟踪并且您将获得所有测试结束时失败规范的所有堆栈跟踪列表
  4. none - 堆栈跟踪不会显示在任何地方

答案 1 :(得分:1)

jasmine-spec-reporter的API已更改。

new example说明了关闭堆栈跟踪的简单选项:

let SpecReporter = require('jasmine-spec-reporter').SpecReporter;

exports.config = {
    framework: 'jasmine',
    // Your config here...

  jasmineNodeOpts: {
    print: function () {}
  },

    onPrepare: function () {
        jasmine.getEnv().addReporter(
            new SpecReporter({
                spec: {
                     displayStacktrace: true
                }
            })
        );
    }
}

答案 2 :(得分:0)

对于那些正在寻找一种稳定且方便的方法来过滤掉Protractor堆栈跟踪的人来说,还有一个选项 - protractor-beautiful-reporter可以生成一个信息量很大的HTML报告,它也可以过滤掉只关注于相关部分(“智能堆栈跟踪”功能)。

答案 3 :(得分:0)

您可以通过传递参数--logging来设置webdriver日志记录级别。 例如,在package.json中使它看起来像这样

"start": "node node_modules/protractor/bin/webdriver-manager start --logging=logging.conf"

创建文件logging.conf并将其放在项目的根文件夹中

并在此文件中添加

  

级别=警告