webentwicklung-frage-antwort-db.com.de

Fehler beim Warten darauf, dass der Winkelmesser mit der Seite mit dem grundlegenden Winkelmesser-Test synchronisiert wird

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();

        })
    })

});

der obige Code wird zurückgegeben

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

und ich habe keine Ahnung, warum das so ist: ptor laden die Seite korrekt, es scheint die Auswahl der Elemente zu sein, die fehlschlagen.

ZU SSHMSH:

Vielen Dank, Sie haben fast recht und haben mir die richtige Philosophie gegeben. Daher ist ptor.sleep (3000) der Schlüssel, um jede Seite warten zu lassen, bis ptor mit dem Projekt synchron ist.

24
user2167582

Ich habe dieselbe Fehlermeldung erhalten (Angular 1.2.13). Meine Tests wurden zu früh gestartet und Protractor schien nicht zu warten, bis Angular geladen wurde.

Anscheinend hatte ich die Winkelmesser-Konfigurationsdatei falsch konfiguriert. Wenn die ng-app-Direktive nicht für das BODY-Element definiert ist, sondern für ein untergeordnetes Element, müssen Sie die rootElement -Eigenschaft in Ihrer Protractor-Konfigurationsdatei an den Selektor anpassen, der Ihr Winkelwurzelelement definiert. Beispiel:

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

wenn dein HTML ist:

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

Ich verwende ChromeDriver und der obige Fehler tritt normalerweise beim ersten Test auf. Ich habe es geschafft, so umzugehen:

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 + '!'
);

Im Wesentlichen warten Sie darauf, dass die aktuelle URL des Browsers zu dem wird, wonach Sie gefragt haben, und lassen Sie zu, dass dies 2s zulässt . Sie möchten wahrscheinlich den ignoreSynchronization = false anschließend umschalten und möglicherweise in eine ptor.wait(...) einschließen. Ich frage mich nur, würde es nicht helfen, die ptor.sleep(5000); zu kommentieren?

EDIT: Nach einiger Erfahrung mit Promise/Deferred habe ich erkannt, dass der korrekte Weg dies zu tun wäre:

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

Bitte beachten Sie, dass, wenn Sie Ändern der URL sind (dh sich von der aktuell aktivierten AngularJS-Seite zu einer anderen bewegen, was bedeutet, dass die AngularJS-Bibliothek neu geladen und initialisiert werden muss), als zumindest meiner Erfahrung nach keine vorhanden ist So vermeiden Sie den Aufruf von ptor.sleep(...). Das Obige funktioniert nur, wenn Sie sich auf derselben Angular-Seite befinden, den Teil der URL jedoch nach dem Hashtag ändern.

13
sshmsh

In meinem Fall ist der Fehler mit dem folgenden Code aufgetreten:

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

Das Problem wurde behoben: 

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

Mit anderen Worten, ich hatte vergessen, zu der Seite zu navigieren, die ich testen wollte, daher hatte Protractor Probleme, Angular zu finden. D'oh!

Der Parameter rootElement des in Ihrer protractor-Konfigurationsdatei definierten exports.config-Objekts muss mit dem Element übereinstimmen, das Ihre ng-app-Direktive enthält. Dies muss nicht eindeutig das Element identifizieren - "div" reicht aus, wenn sich die Direktive in einer div befindet, wie in meinem Fall.

Von 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',

Ich habe mit Protractor angefangen, indem ich mir die ansonsten exzellente egghead.io-Vorlesung angesehen habe, in der er einen komprimierten exports.config verwendet. Da rootElement standardmäßig body ist, gibt es keinen Hinweis darauf, was mit Ihrer Konfiguration nicht stimmt, wenn Sie nicht mit einer Kopie der bereitgestellten Referenzkonfiguration beginnen und auch nicht 

Fehler beim Warten auf die Synchronisierung von Protractor mit der Seite: {}

die Nachricht gibt keinen Hinweis.

2
ivarg

Ich musste das wechseln:

    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
        });
    });

um dies zu tun:

    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
        });
    });

der entscheidende Unterschied ist:

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

hoffe das kann jemandem helfen.

1
philn5d

Wenn Sie verwenden 

browser.restart ()

einige Male in Ihrer Spezifikation wirft es den gleichen Fehler .. Versuchen Sie es zu verwenden 

waitit browser.restart ()

0
Ganesh

Ich habe diese Fehlermeldung erhalten:

Fehler: Fehler beim Warten auf die Synchronisierung von Protractor mit der Seite: "window.angular ist undefiniert. Dies kann entweder darauf zurückzuführen sein, dass es sich nicht um eine eckige Seite handelt oder weil Ihr Test eine clientseitige Navigation beinhaltet, die das Bootstrapping von Protractor beeinträchtigen kann http://git.io/v4gXM für Details "

Die Lösung bestand darin, page.navigateTo() vor page.getTitle() aufzurufen.

Vor:

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

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

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

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

Nach dem:

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