web-dev-qa-db-ja.com

基本的な分度器テストで分度器がページと同期するのを待っているときにエラーが発生する

describe('my homepage', function() {
    var ptor = protractor.getInstance();
    beforeEach(function(){
        // ptor.ignoreSynchronization = true;
        ptor.get('http://localhost/myApp/home.html');
        // ptor.sleep(5000);
    })
    describe('login', function(){

        var email = element.all(protractor.By.id('email'))
            , pass = ptor.findElement(protractor.By.id('password'))
            , loginBtn = ptor.findElement(protractor.By.css('#login button'))
            ;

        it('should input and login', function(){
            // email.then(function(obj){
            //  console.log('email', obj)
            // })
            email.sendKeys('[email protected]');
            pass.sendKeys('shakalakabam');
            loginBtn.click();

        })
    })

});

上記のコードは戻ります

 Error: Error while waiting for Protractor to sync with the page: {}

そして、これがなぜなのかわからない、ptorがページを正しくロードする、失敗する要素の選択のようだ。

SSHMSHへ:

ありがとう、あなたのほぼ正しい、そして私に正しい哲学を与えたので、キーはptor.sleep(3000)がptorがプロジェクトと同期するまで各ページを待機させることです。

24
user2167582

同じエラーメッセージ(Angular 1.2.13)が表示されました。テストの開始が早すぎたため、ProtractorはAngularがロードされるのを待ちませんでした。

分度器の設定ファイルを誤って設定したようです。 ng-appディレクティブはBODY要素では定義されていませんが、子孫では、angularルート要素を定義するセレクタに合わせて、分度器設定ファイルのrootElementプロパティを調整する必要があります:

// protractor-conf.js
rootElement: '.my-app',

hTMLが次の場合:

<div ng-app="myApp" class="my-app">
39
Ludder

ChromeDriverを使用していますが、通常、最初のテストで上記のエラーが発生します。私はこのようにそれを回避することができました:

_ptor.ignoreSynchronization = true;
ptor.get(targetUrl);
ptor.wait(
    function() {
            return ptor.driver.getCurrentUrl().then(
                function(url) {
                    return targetUrl == url;
                });
    }, 2000, 'It\'s taking too long to load ' + targetUrl + '!'
);
_

基本的に、あなたはブラウザの現在のURLがあなたが求めているものになり、これが起こるのを2秒待つことを待っています。おそらく_ignoreSynchronization = false_を後で切り替えて、おそらくptor.wait(...)でラップしたいでしょう。ただ疑問に思う、ptor.sleep(5000);のコメントを外すのは役に立ちませんか?

編集:Promise/Deferredのいくつかの経験の後、正しいこれを行う方法は次のようになることに気付きました:

_loginBtn.click().then(function () {
    ptor.getCurrentUrl(targetUrl).then(function (newURL){
        expect(newURL).toBe(whatItShouldBe);
    });
});
_

変更の場合(つまり、現在のAngularJSがアクティブになっているページから別のページに移動し、AngularJSライブラリをリロードして初期化する必要があることを意味する場合)、少なくとも私の経験では、 ptor.sleep(...)呼び出しを回避する方法はありません。上記は、同じAngularページにとどまっているが、ハッシュタグの後のURLの部分を変更している場合にのみ機能します。

13
sshmsh

私の場合、次のコードでエラーが発生しました。

describe("application", function() {
  it("should set the title", function() {
    browser.getTitle().then(function(title) {
      expect(title).toEqual("Welcome");
    });
  });
});

これを行うことで修正しました:

describe("application", function() {
  it("should set the title", function() {
    browser.get("#/home").then(function() {
      return browser.getTitle();
    }).then(function(title) {
      expect(title).toEqual("Welcome");
    });
  });
});

つまり、テストしたいページに移動するのを忘れていたため、ProtractorはAngularを見つけるのに苦労していました。ど!

分度器設定ファイル で定義されているexports.configオブジェクトのrootElement paramは、ng-appディレクティブを含む要素と一致する必要があります。これは要素を一意に識別する必要はありません。ディレクティブがdivにある場合は、私の場合のように 'div'で十分です。

referenceConf.jsから:

// Selector for the element housing the angular app - this defaults to
// body, but is necessary if ng-app is on a descendant of <body>  
rootElement: 'div',

私は分度器を始めました。それ以外の点では優れた egghead.io講義 を見て、彼は凝縮されたexports.configを使用しています。 rootElementのデフォルトはbodyであるため、提供された参照構成のコピーで開始しない場合でも、構成の何が悪いのかについてのヒントはありません。

分度器がページと同期するのを待っているときにエラーが発生しました:{}

メッセージはあまり手がかりを与えません。

2
ivarg

私はこれをやめなければなりませんでした:

    describe('navigation', function(){

        browser.get('');

        var navbar = element(by.css('#nav'));

        it('should have a link to home in the navbar', function(){
            //validate
        });

        it('should have a link to search in the navbar', function(){
            //validate
        });
    });

これを行うには:

    describe('navigation', function(){

        beforeEach(function(){
            browser.get('');
        });
        var navbar = element(by.css('#nav'));

        it('should have a link to home in the navbar', function(){
            //validate
        });

        it('should have a link to search in the navbar', function(){
            //validate
        });
    });

主要な差分:

    beforeEach(function(){
        browser.get('');
    });

これが誰かを助けることを願っています。

1
philn5d

使用している場合

browser.restart()

仕様書で何度か、同じエラーがスローされます。使用してみてください

browser.restart()を待つ

0
Ganesh

私はこのエラーを受け取っていました:

失敗:分度器がページと同期するのを待機中にエラーが発生しました: "window.angularは未定義です。これは、これが非角形ページであるか、テストに分度器のブートストラップを妨げる可能性のあるクライアント側ナビゲーションが含まれている可能性があります。 http://git.io/v4gXM 詳細については」

解決策は、page.navigateTo()の前にpage.getTitle()を呼び出すことでした。

前:

import { AppPage } from './app.po';

describe('App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
  });

  it('should have the correct title', () => {
    expect(page.getTitle()).toEqual('...');
  })
});

後:

import { AppPage } from './app.po';

describe('App', () => {
  let page: AppPage;

  beforeEach(() => {
    page = new AppPage();
    page.navigateTo();
  });

  it('should have the correct title', () => {
    expect(page.getTitle()).toEqual('...');
  })
});
0