Javascript 清理量角器堆栈跟踪
问题:Javascript 清理量角器堆栈跟踪,javascript,selenium,jasmine,protractor,end-to-end,Javascript,Selenium,Jasmine,Protractor,End To End,问题: 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.
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)
是否可以清除堆栈跟踪并只留下相关帧来消除所有特定的量角器
、WebDriverJ
和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)
让我们执行这个示例测试:
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)
使用量角器
3.0.0和jasmine2
在
mocha
世界中,有一个相关的包可以过滤掉来自node\u模块内部的所有东西,并且mocha
本身留下一个干净的堆栈跟踪,易于阅读。事实证明,如果您使用任何自定义报告器,它们可能会在控制堆栈跟踪的输出时引入新的行为。量角器本身隐藏了几乎所有的东西,所以您不会看到来自node_模块或Jasmine的任何日志条目
在使用时,它提供了一个控制堆栈跟踪的选项,可能是在选项中设置了一些详细模式。出于某种原因,建议在中使用all
模式,该模式基本上显示enitre堆栈跟踪
onPrepare: function () {
jasmine.getEnv().addReporter(new SpecReporter({
spec: {
displayStacktrace: true
}
}));
如果您只需将选项displayStacktrace
从all
更改为none
,您应该会得到没有任何堆栈跟踪的干净结果。还有选项摘要
和规格
。在您的示例中,您可能没有注意到它们之间的差异,但是如果您在套件中添加了更多的规范,那么您将能够看到差异:
specs
-如果spec在运行测试的过程中失败,您将在spec失败消息后立即看到它的堆栈跟踪
summary
-如果spec在运行测试的过程中失败,则在spec失败消息后,您不会立即看到它的堆栈跟踪,但在所有测试结束时,您将获得失败spec的所有堆栈跟踪的列表
all
-结合specs
和summary
-如果spec在运行测试过程中失败,您将在spec失败消息后立即看到它的堆栈跟踪,并且在所有测试结束时,您将获得失败spec的所有堆栈跟踪列表
none
-堆栈跟踪不会显示在任何位置
jasmine spec reporter的API已更改
说明了关闭堆栈跟踪的一个简单选项:
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
}
})
);
}
}
对于那些正在寻找稳定和方便的方法来过滤出量角器stacktrace的人,还有一个选项-它将生成一个信息丰富的HTML报告,该报告还可以过滤出stacktrace,只关注相关部分(“智能堆栈跟踪”功能).您可以通过传递参数--logging来设置webdriver日志记录级别。
例如,在package.json中
"start": "node node_modules/protractor/bin/webdriver-manager start --logging=logging.conf"
创建logging.conf文件并将其放在项目的根文件夹中
在这个文件中
级别=警告
你使用定制记者吗?对于同一个测试,我有一个更清晰的结果。@MichaelRadionov刚刚单独尝试了一个没有报告器的默认配置-是的,结果不同而且更清晰(尽管它仍然包含selenium
和jasmine
特定帧)。你是对的,看起来这让stacktrace更糟了。请发布一个答案,我会接受的。谢谢@MichaelRadionov顺便说一句,撇开jasmine spec reporter的相关问题不谈,你认为我们可以更彻底地清除堆栈跟踪,消除所有节点模块和jasmine核心特定的东西吗?那么它看起来会接近期望输出下的值?谢谢。我在docs for中看到,它有一个选项displayStacktrace:“无”
。也许它会隐藏一切?@MichaelRadiov有趣的是,我们一直在使用all
,这真的是太多不必要的信息了,正如我们在答案中所看到的那样。我尝试了none
-这只是输出一个错误本身,没有更多<代码>摘要
在本例中的行为与all
相同。换句话说,summary
和all
抛出以node\u modules/selenium webdriver/lib/atoms/error.js开始的堆栈跟踪,而不是实际测试本身中的行。谢谢