web-dev-qa-db-ja.com

$ resourceを使用すると、分度器がページとの同期を待機してタイムアウトします

小さな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です。

14
Joseph S.

これは 既知の問題 ですが、一時的な回避策があります。セットする 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);
  });
});
26
Harri Siirak

browser.ignoreSynchronization = true;私のためにうまくいった。

3
Lokesh

_browser.ignoreSynchronization_を使用する代わりに、browser.waitForAngularEnabled(*boolean*)を使用します。 browser.waitForAngularEnabled(false)は_browser.ignoreSynchronization_をtrueに設定し、browser.waitForAngularEnabled(true)は_browser.ignoreSynchronization_をfalseに設定します。

これをテストスイートの構成ファイルの一部として含めることもできます。

_onPrepare: function () {
    'use strict';
    browser.waitForAngularEnabled(false);
}
_
1
Peter Parker

私は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);
    });
});
1
Stevo