2013-11-02 75 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); 
} 
相關問題