量角器测试在我的应用程序中没有发现注入器,但只在 Jenkins 上发现

Protractor tests find no injector in my app, but only on Jenkins

我偶尔会看到这个错误,只在 Jenkins 上,但至少一次测试 运行。如果我幸运的话,它不会每 5 或 6 个构建发生一次:

    Error: Error while waiting for Protractor to sync with the page: "root element ([ng-app]) has no injector. this may mean it is not inside ng-app."
      at Error (<anonymous>)
      at /home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1526:15
      at newFrame.onAbort (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1679:7)
      at [object Object].webdriver.promise.Frame_.notify_ (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1914:5)
      at [object Object]._onTimeout (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1887:13)
      at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
  ==== async task ====
  Protractor.waitForAngular()
      at [object Object].webdriver.WebDriver.schedule (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/webdriver.js:345:15)
      at [object Object].Protractor.executeAsyncScript_ (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/lib/protractor.js:251:26)
      at [object Object].Protractor.waitForAngular (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/lib/protractor.js:274:15)
      at [object Object].to.(anonymous function) [as getCurrentUrl] (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/lib/protractor.js:60:7)
      at Context.<anonymous> (/home/tester/workspace/EncoreUI_Template_PR_Builder/test/stories/loggingIn.js:37:32)
      at /home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/testing/index.js:121:22
      at [object Object].webdriver.promise.ControlFlow.runInNewFrame_ (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1654:20)
      at [object Object].webdriver.promise.ControlFlow.runEventLoop_ (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1518:8)
      at [object Object].wrapper [as _onTimeout] (timers.js:258:14)
  ==== async task ====
      at Context.ret (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/protractor/node_modules/selenium-webdriver/testing/index.js:119:12)
      at Test.Runnable.run (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runnable.js:218:15)
      at Runner.runTest (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:374:10)
      at /home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:452:12
      at next (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:299:14)
      at /home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:309:7
      at next (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:248:23)
      at Object._onImmediate (/home/tester/workspace/EncoreUI_Template_PR_Builder/node_modules/mocha/lib/runner.js:276:5)
      at processImmediate [as _immediateCallback] (timers.js:336:15)

我发现在我的本地 运行 测试或 Travis 上似乎没有发生的错误。但是,在 Jenkins slave 运行ning firefox、xvfb 和 Protractor 1.7.0 上,我经常遇到这个错误。至少考一次。

我更新了我的 conf 文件以指向“[ng-app]”作为我的根元素。

我在 the angular getTestability docs 中看到它被抛出 "often because the root element is outside of the ng-app",但在这种情况下,选择器返回正常,所以我想知道根元素没有的其他一些原因注射器。

问题分为两部分。第一,Jenkins 运行s 在虚拟机上,并且比我的本地计算机具有更少的 CPU 功率和网络连接速度,这解释了为什么它从未出现在本地。第二部分与被测应用程序的架构有关。通常,Angular 应用程序设计为用作单页应用程序,我正在测试的应用程序实际上是单页应用程序的集合,通过代理连接在一起。它给人一种它是一个大型应用程序的错觉,同时保持模块化并且更容易迭代。

登录应用程序时出现问题。 Angular 应用程序让您登录,代理到重定向,并且在此过程中有一个 "white flash" 没有任何事情发生。此时 Protractor 调用 waitForAngular,它断言在继续之前您的应用程序中存在注入器。

这是事情变得有点奇怪的部分。根据提交日志,a typo in a critical check for an injector 可能已经阻止了以前版本的 Protractor 中发生的任何问题,因此在升级时,在 运行 慢到足以偶尔触发竞争条件的环境中触发此行为浏览器。我不太确定。但无论如何,我的登录页面对象中的这段代码有助于解决问题。

login: {
    value: function (username, password) {
        // normal login code
        // by now, it has attempted to log in and redirect, and now...
        browser.wait(function () {
            return browser.waitForAngular().then(function () {
                // injector found, everything is ok
                return true;
            }, function () {
                // if any error occurred, don't throw an exception
                // give `.wait` a false result to trigger a retry
                return false;
            });
        }, 10000, 'Injector never appeared after 10 seconds.');
    }
}

因此,如果您的系统包含许多 Angular 个应用程序,这些应用程序通过代理一起运行 运行g,当您在速度较慢的环境中从一个应用程序传递到下一个应用程序时,您可能会遇到奇怪的错误 CPU and/or 在量角器测试期间网络连接受限。