在远程selenium服务器上运行Protractor测试时,Jasmine spec超时

时间:2016-09-27 00:16:51

标签: angularjs selenium protractor selenium-rc selenium-grid

我有本地运行良好的Protractor测试(directConnect:true),但是当我尝试在远程Selenium服务器(Grid)上运行它们时,我总是收到以下消息。

A Jasmine spec timed out. Resetting the WebDriver Control Flow.

查看失败,消息和堆栈显示以下所有测试用例:

Message:
  Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Stack:
  Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
    at Timer.listOnTimeout (timers.js:92:15)

我尝试了很多东西,例如增加jasmine超时间隔,将更早的超时(例如getPageTimeout和allScriptsTimeout)添加到conf,但它仍然会抛出jasmine超时错误。该日志显示以下错误:

00:03:18.328 INFO - Done: [execute async script: try { return (function (rootSelector, ng12Hybrid, callback) {
var el = document.querySelector(rootSelector);

try {
  if (!ng12Hybrid && window.getAngularTestability) {
    window.getAngularTestability(el).whenStable(callback);
    return;
    }
  if (!window.angular) {
    throw new Error('window.angular is undefined.  This could be either ' +
      'because this is a non-angular page or because your test involves ' +
      'client-side navigation, which can interfere with Protractor\'s ' +
      'bootstrapping.  See http://git.io/v4gXM for details');
}
  if (angular.getTestability) {
  angular.getTestability(el).whenStable(callback);
}   else {
      if (!angular.element(el).injector()) {
    throw new Error('root element (' + rootSelector + ') has no injector.' +
       ' this may mean it is not inside ng-app.');
  }
  angular.element(el).injector().get('$browser').
      notifyWhenNoOutstandingRequests(callback);
}
} catch (err) {
callback(err.message);
}
}).apply(this, arguments); }
catch(e) { throw (e instanceof Error) ? e : new Error(e); }, [body, false]])

我确信我的应用程序是有角度的,并且在本地运行时可以成功运行。我试过设置

browser.ignoreSynchronization = true

,以及设置

rootElement='html#ng-app' 
conf中的

(bc我的ng-app不在正文中,而是在html标记内)。框架设置为“茉莉花”。虽然我已经尝试过jasmine2'但似乎没有任何区别。在远程服务器上,我可以启动firefox,UI会显示启动的firefox会话。然而它只是坐在那里直到超时发生。任何意见都将不胜感激!

1 个答案:

答案 0 :(得分:2)

Jasmine需要知道它正在运行异步进程,并且该进程应该完成(继续执行您可能正在运行的任何其他测试)。

这是通过将done传递给Jasmine异步方法回调并在解析异步操作时调用done()获得的。

如果您不致电done(),Jasmine会显示超时错误。我认为这应该可以解决你的问题。

更多信息: Mocking ngResource in Angular unit tests

希望这有帮助!