一尘不染

调试量角器到角度同步问题的规范方法

selenium

问题描述:

我们最近在量角器端到端测试中打开应用程序中的页面之一时遇到了这个臭名昭著的错误:

失败:超时,等待异步Angular任务在50秒后完成。这可能是因为当前页面不是Angular应用程序。

这是browser.get("/some/page/");在我们的一项测试中的一次通话中发生的:

describe("Test", function () {
    beforeEach(function () {
        browser.get("/some/page/");
    });

    it("should test something", function () {
        // ...
    });
)};

而且,对我们的案例来说很奇怪的是, 该错误未在Angular Web应用程序的任何其他页面上引发
-Protractor与Angular同步而没有任何问题。ng-app在所有页面上位置相关的内容都是相同的- ng-app在root
html标记上定义:

<html class="ng-scope" lang="en-us" ng-app="myApp" ng-strict-di="">

行为是一致的-每次我们使用导航到此页面时browser.get(),都会收到此错误。每当我们导航到应用程序中的任何其他页面时,同步均有效。

请注意,当然,我们可以关闭此页面的同步并将其视为非角度同步,但这只能视为一种解决方法。

问题:

还有什么会导致量角器到角度同步失败?我们应该检查什么?

而且,通常, 在Protractor中调试同步问题的推荐方法是什么?

使用当前最新的量角器5.5.1,角度1.5.6。


阅读 255

收藏
2020-06-26

共1个答案

一尘不染

好的,这个问题引起了我的兴趣,因此我想出了一个程序化的解决方案来确定如何等待量角器:

var _injector = angular.element(document).injector();
var _$browser = _injector.get('$browser');
var _$http = _injector.get('$http');
var pendingTimeout = true;

//this is actually method that protractor is using while waiting to sync
//if callback is called immediately that means there are no $timeout or $http calls
_$browser.notifyWhenNoOutstandingRequests(function callback () {
  pendingTimeout = false
});

setTimeout(function () {
  //this is to differentiate between $http and timeouts from the "notifyWhenNoOutstandingRequests" method
  if (_$http.pendingRequests.length) {
    console.log('Outstanding $http requests', _$http.pendingRequests.length)
  } else if (pendingTimeout) {
    console.log('Outstanding timeout')
  } else {
    console.log('All fine in Angular, it has to be something else')
  }
}, 100)

在这里,在http://plnkr.co/edit/O0CkpnsnUuwEAV8I2Jil?p=preview中,您可以尝试超时和$
http调用,我的延迟端点将等待10秒才能解决该调用,希望对您有所帮助为了你

2020-06-26