小さな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 = [];
テストは期待どおりに失敗しますが、さらに重要なのは、タイムアウトしないことです。
Query()を有効にすると、ブラウザーでアプリを手動で実行する場合と、Protractorによって開かれたブラウザーウィンドウを表示する場合の両方で、APIによって返されるデータがリピーターによって正しく表示されます。
サービスがAPIと通信しているときに、Protractorがページと同期できないのはなぜですか?
AngularJSはv1.2.0-rc3です。分度器はv0.12.0です。
これは 既知の問題 ですが、一時的な回避策があります。セットする 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);
});
});
browser.ignoreSynchronization = true;
私のためにうまくいった。
_browser.ignoreSynchronization
_を使用する代わりに、browser.waitForAngularEnabled(*boolean*)
を使用します。 browser.waitForAngularEnabled(false)
は_browser.ignoreSynchronization
_をtrue
に設定し、browser.waitForAngularEnabled(true)
は_browser.ignoreSynchronization
_をfalse
に設定します。
これをテストスイートの構成ファイルの一部として含めることもできます。
_onPrepare: function () {
'use strict';
browser.waitForAngularEnabled(false);
}
_
私はProtractor3.3.0を使用していますが、これをテストで機能させるには、セットアップが完了するまで無視同期を延期する必要がありました。
だから私のbeforeEachで私は自分の行動を呼びます:
var searchBox = element(by.css('#inpt_search'));
searchBox.sendKeys('test');
次に、モックバックエンドがビューに入力されるのを待つ必要があります(これらのsleep
呼び出しに満足していないので、誰かがこれを行うためのより良い方法がある場合はコメントしてください、expectedConditions.presenceOf
を次のように機能させることはできませんbrowser.sleep(500)
を使用する同じバグの一部です。次に、テストで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);
});
});