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开始的堆栈跟踪,而不是实际测试本身中的行。谢谢