2013-11-02 38 views
14

我正在测试一个小的AngularJS应用程序的量角器。

这是测试:

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') 
    }]) 

运行使用量角器结果在下面的错误这个测试:

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

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

$scope.drafts = Draft.query(); 

这样:

$scope.drafts = []; 

符合市场预期,但更重要的是该测试失败:不超时。

通过查询()功能,无论是在浏览器中手动运行该应用时,在由量角器打开浏览器窗口看时,该API返回的数据正确地转发器显示。

为什么量角器无法与网页同步,当服务与API沟通?

AngularJS是v1.2.0-rc3。量角器是v0.12.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

谢谢,我稍后再尝试了这一点,让你知道它是否工作。实际上,我在发布之前已经阅读过这个GitHub问题,但我的印象是只有在我的测试应用程序没有执行的定期轮询API时才需要解决方法。它只在初始化控制器时发送一次API请求。 –

+10

这确实是正确的解决方案。由于Protractor 0.12.0将Protractor的实例公开为'browser',因此在'element.all(by.repeater('...'));'之前添加'browser.ignoreSynchronization = true;'就足够了。 –

+0

完美的作品! – softvar

3

browser.ignoreSynchronization = true;摸索出适合我。

1

我用量角器3.3.0,并得到这个在我的测试工作,我不得不推迟忽略同步,直到我已经做了设置后。

所以在我beforeEach我打电话给我的行动:

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

然后我不得不等待模拟后端填充视图(我并不喜欢这些sleep电话,如果任何人有一个更好的办法请使用browser.sleep(500)进行评论,我无法获得expectedConditions.presenceOf,因为它是同一个bug的一部分)。 然后在测试中,我设置了browser.ignoreSynchronization = true,它可以阻止任何被阻止的内容并查看浏览器内容。

describe('standard search', function(){ 
    beforeEach(function(){ 
     openApp(); 
     var searchBox = element(by.css('#inpt_search')); 
     searchBox.sendKeys('test'); 
     browser.sleep(500); 
    }); 
    it('should work or summat', function() { 
     browser.ignoreSynchronization = true; 
     var fileItems = element.all(by.repeater('item in list')); 
     expect(fileItems.count()).toEqual(50); 
    }); 
}); 
+0

谢谢Stevo,它适用于我在量角器4.0.10 –

0

代替使用browser.ignoreSynchronization,请使用browser.waitForAngularEnabled(*boolean*)browser.waitForAngularEnabled(false)browser.ignoreSynchronizationtruebrowser.waitForAngularEnabled(true)browser.ignoreSynchronizationfalse

还可以包括此为您的测试套件配置文件的一部分:

onPrepare: function() { 
    'use strict'; 
    browser.waitForAngularEnabled(false); 
} 
相关问题