量角器,Jasmine超时问题

时间:2015-01-15 20:28:45

标签: protractor

我正在使用Protractor和Jasmine进行e2e测试。我们的申请是在Angular。

我在配置文件中写了getPageTimeout: 500000allScriptsTimeout: 600000。根据GitHub添加了defaultTimeoutInterval:500000

即便如此,我还是得到了以下异常。感谢任何帮助。


A Jasmine spec timed out. Resetting the WebDriver Control Flow.
The last active task was:
Protractor.waitForAngular()
at [object Object].webdriver.WebDriver.schedule (C:\Users\AppData\Roaming\npm\node_modules\protractor\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:345:15)
at [object Object].Protractor.executeAsyncScript_ (C:\Users\AppData\Roaming\npm\node_modules\protractor\lib\protractor.js:1141:26)
at [object Object].Protractor.waitForAngular (C:\Users\AppData\Roaming\npm\node_modules\protractor\lib\protractor.js:1159:15)
at [object Object].getWebElements (C:\Users\AppData\Roaming\npm\node_modules\protractor\lib\protractor.js:191:21)
at [object Object].getWebElements 

7 个答案:

答案 0 :(得分:7)

Angular永远不会在你的应用中做好准备。您看到茉莉花超时而不是量角器超时的唯一原因是因为您将量角器超时限制增加到高于茉莉花超时限制。 这可能是应用无限期轮询的问题,而不是您编写测试的问题。

来自https://github.com/angular/protractor/blob/master/docs/timeouts.md

“在执行任何操作之前,Protractor要求Angular等待页面同步。这意味着所有超时和http请求都已完成。如果您的应用程序不断轮询$ timeout或$ http,它将永远不会被注册为完全加载你应该使用$ interval服务(interval.js)来连续轮询(在Angular 1.2rc3中引入)。“

答案 1 :(得分:3)

对于仅在使用Internet Explorer作为测试浏览器时在此问题中运行的人,请尝试在每次测试时强制执行新的干净会话:

量角器-conf.js

{"browserName": "internet explorer",
    "ie.forceCreateProcessApi": true,
    "ie.browserCommandLineSwitches": "-private",
    "ie.ensureCleanSession": "true",
    "seleniumAddress": 'http://10.0.1.XXX:4444/wd/hub'
}

确保设置路径TabProcGrowth" = dword: 00000000中的HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main

答案 2 :(得分:2)

配置文件中设置,例如:

$ python sample.py

答案 3 :(得分:2)

试试这个:

describe('Something', function()
{

  it('should do something', function() {
  },500000);

},500000);

答案 4 :(得分:1)

尝试在配置文件中添加以下timeoutinterval

  jasmineNodeOpts: {
    defaultTimeoutInterval: 360000
  }

答案 5 :(得分:0)

尝试添加以下代码,jasmine默认时间为5秒。以下代码将等待所有测试用例完成任务&对我来说很好。 jasmine.getEnv()。defaultTimeoutInterval = 15000;

onPrepare: function(){
jasmine.getEnv().defaultTimeoutInterval =your time to set in milli second;
}

答案 6 :(得分:0)

对于 Angular2+,请在此处快速回答以缩短您的研究时间。
而不是像 setInterval(() => {}, 20000); 这样的东西,只需使用这个:

    this.ngZone.runOutsideAngular(() => {
        setInterval(() => {
            this.ngZone.run(() => {
                // whatever you want to do from time to time
            });
        }, 20000);
    });    

您可以在构造函数中将 ngZone 添加为任何其他服务,如下所示:
private ngZone: NgZone,

确保您已查看从 app-root (AppComponent.ts) 开始的所有组件链,还包括自定义服务。在任何地方设置的计时器都可能导致此问题。