使用$ resource时,量角器会等待与页面同步

时间:2013-11-02 12:28:46

标签: javascript angularjs angularjs-resource protractor

我正在使用一个小型AngularJS应用程序测试Protractor。

这是测试:

describe('Testing Protractor', function() {
  var draftList;

  it('should count the number of drafts', function() {
    browser.get('#/');
    draftList = element.all(by.repeater('newsletter in drafts'));
    expect(draftList.count()).toEqual(2);
  });
});

控制器:

angular.module('myApp.controllers', []).
  controller('DraftsCtrl', ['$scope', 'Draft', function($scope, Draft) {
    $scope.drafts = Draft.query();
}])

草稿服务:

angular.module('myApp.services', ['ngResource']).
  factory('Draft', ['$resource',
    function($resource) {
      return $resource('api/drafts/:id')
    }])

使用Protractor运行此测试会导致以下错误:

Error: Timed out waiting for Protractor to synchronize with the page after 11 seconds

但是,如果在控制器中我改变了这一行:

$scope.drafts = Draft.query();

到此:

$scope.drafts = [];

测试按预期失败,但更重要的是:它没有超时。

启用query()后,无论是在浏览器中手动运行应用程序还是查看Protractor打开的浏览器窗口,API返回的数据都会由转发器正确显示。

为什么当服务与API通信时,Protractor无法与页面同步?

AngularJS是v1.2.0-rc3。量角器是v0.12.0。

4 个答案:

答案 0 :(得分:26)

这是known issue,但有一个临时解决方法。设置ptor.ignoreSynchronization = true

例如:

describe('Testing Protractor', function() {
  var draftList;
  var ptor;

  beforeEach(function() {
    ptor = protractor.getInstance();
    ptor.ignoreSynchronization = true;
  });

  it('should count the number of drafts', function() {
    ptor.get('#/');
    draftList = element.all(by.repeater('newsletter in drafts'));
    expect(draftList.count()).toEqual(2);
  });
});

答案 1 :(得分:3)

browser.ignoreSynchronization = true;为我做好了准备。

答案 2 :(得分:1)

我正在使用Protractor 3.3.0并且为了在我的测试中使用它,我必须推迟忽略同步,直到我完成设置。

所以在我之前我每次都打电话给我:

var searchBox = element(by.css('#inpt_search'));
searchBox.sendKeys('test');

然后我必须等待模拟后端填充视图(我对这些sleep调用不满意所以如果有人有更好的方法来做这个请评论,我不能得到{{ 1}}使用expectedConditions.presenceOf工作,因为它是同一个bug的一部分。 然后在测试中我设置了browser.sleep(500),它会阻止被阻止的内容并查看浏览器内容。

browser.ignoreSynchronization = true

答案 3 :(得分:1)

不使用This docker project is intended to run zeppelin in a docker container, complete with the hadoop and spark clients configured to work with the hadoop cluster. For OSX: Prerequisites (available through brew install): - docker - docker-machine - virtualbox First, ensure that you have a virtual machine set up for docker-machine. You can create one named `dockermachine` with: ``` docker-machine create --driver virtualbox dockermachine ``` If the vm is running, stop it. ``` docker-machine stop dockermachine ``` Next, set up port the forwarding rules. ``` VBoxManage modifyvm dockermachine --natpf1 "zeppelinPF1,tcp,,4194,,4194" VBoxManage modifyvm dockermachine --natpf1 "zeppelinPF2,tcp,,4195,,4195" VBoxManage modifyvm dockermachine --natpf1 "zeppelinPF3,tcp,,4196,,4196" VBoxManage modifyvm dockermachine --natpf1 "zeppelinPF4,tcp,,8080,,8080" ``` ,而是使用browser.ignoreSynchronizationbrowser.waitForAngularEnabled(*boolean*)browser.waitForAngularEnabled(false)设置为browser.ignoreSynchronizationtruebrowser.waitForAngularEnabled(true)设置为browser.ignoreSynchronization

您还可以将其作为测试套件配置文件的一部分包含在内:

false