量角器测试在我的应用程序中没有发现注入器,但只在 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 在量角器测试期间网络连接受限。
我偶尔会看到这个错误,只在 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 在量角器测试期间网络连接受限。