问题:
是否可以清理堆栈跟踪并仅保留相关的框架,从而消除所有Protractor
,WebDriverJS
和Jasmine
特定的内容?
故事:
让我们执行此示例测试:
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)
正如您所看到的,在测试错误实际发生的哪一行上并不容易找到。它隐藏在由Protractor
,WebDriverJS
和Jasmine
堆栈帧覆盖的堆栈跟踪内的某个位置。这使得调试和开发端到端测试变得困难。
期望的输出:
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_modules
和mocha
内部的所有内容,从而留下易于阅读的干净堆栈跟踪
答案 0 :(得分:3)
事实证明,如果您使用任何自定义报告器,它们可能会引入控制堆栈跟踪输出的新行为。 Protractor本身隐藏了很多东西,所以你不会看到来自node_modules或Jasmine的任何日志条目。
当您使用jasmine-spec-reporter(提供控制堆栈跟踪的选项)时,您可能已经在选项中设置了一些详细模式。在docs for Protractor由于某种原因,建议使用all
模式,它基本上显示enitre堆栈跟踪。
onPrepare: function () {
jasmine.getEnv().addReporter(new SpecReporter({
spec: {
displayStacktrace: true
}
}));
如果您只是将选项displayStacktrace
从all
更改为none
,那么您应该获得干净的结果,而不会有任何堆栈跟踪。还有选项summary
和specs
。您可能没有注意到它们之间的区别,但如果您在套件中添加了更多规格,那么您将能够看到差异:
specs
- 如果规范在运行测试过程中失败,您会在规范失败消息后立即看到它的堆栈跟踪summary
- 如果规范在运行测试过程中失败,您将不在规范失败消息后立即查看堆栈跟踪,但您将获得一个列表在所有测试结束时失败规格的所有堆栈跟踪all
- 结合specs
和summary
- 如果规范在运行测试过程中失败,您会在规范失败消息后立即看到堆栈跟踪并且您将获得所有测试结束时失败规范的所有堆栈跟踪列表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并将其放在项目的根文件夹中
并在此文件中添加
级别=警告