3

Ich habe gerade angefangen Winkelmesser für e2e Tests einer Angular Single-Page-Anwendung zu verwenden. Ich habe den Test mit Login-Seite gestartet. Dies ist der Test, den ich schrieb für scheitern FallWinkelmesser browser.getCurrentUrl() funktioniert nicht bei Änderung der Route

Tesr Fall 1

it('Login with wrong email', function() { 
    loginPage.get(); 
    loginPage.setEmail('[email protected]'); 
    loginPage.setPassword('12345678'); 
    loginPage.submit() 

    expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/login') 
    }) 

Der obige Code funktioniert perfekt. Ich teste den Login-Fehler mit der URL, wenn die URL nicht geändert wurde, als Fehler. Q1) Ist das der richtige Ansatz? sollte ich nach der Fehlermeldung suchen, habe ich ein Beispiel wie dieses gesehen, so dass Login fehlgeschlagen mit URL.

Test Case 2

Dies ist, wo ich den Fehler, Testfall bin immer die erfolgreiche Anmeldung zu überprüfen.

it('Login with correct email', function() { 
    loginPage.get(); 
    loginPage.setEmail('[email protected]'); 
    loginPage.setPassword('12345678'); 
    loginPage.submit() 
    expect(browser.getCurrentUrl()).toBe(loginPage.appUrl + '/#/home') 
}) 

Der obige Testfall funktioniert auch perfekt, wenn ich nicht browser.getCurrentUrl() verwende ich die folgende Störung erhalte, wenn ich getCurrentUrl verwenden, diese loginPage.submit() ist ein erfolgreicher Anmeldeversuch und Umleitungen auf eine andere Strecke.

Ich habe dieses Problem gegoogled und viel Lösung gefunden und keiner von ihnen scheint zu funktionieren.

Lösungen erprobt

  1. Added allScriptsTimeout, getPageTimeout Konfigurationsdatei Winkelmesser.
  2. defaultTimeoutInterval hinzugefügt Datei SO Fragen folgenden
  3. Gefunden issue, link1, link2 und diese Github zur Konfiguration versuchte, alle drei, und keiner scheint
  4. Als ich mit der timeout Fehlermeldung zu arbeiten googeln, fand ich diese SO link1 Fragen, link2, ich alle versucht, die nicht

Grundsätzlich alle Lösungen arbeitet, sagt wait,zu verwenden, waitForAngular. Ich habe alles in thenable Mode versucht, da alle Renditen versprechen. Ich fand dieses Problem wegen der Verwendung von browser.getCurrentUrl. Lassen Sie mich wissen, wo ich falsch liege und würde gerne über e2e Tests mit Winkelmesser wissen.

Ich würde gerne die Grundlagen des Winkelmessers wissen, wie es bei der Routenänderung funktioniert und wie eine asynchrone Benutzeraktion wie $http vom Winkelmesser gehandhabt wird. Sollte ich explizit Versprechungen usw. verwenden.

Jede Hilfe wird sehr geschätzt.

+0

Navigieren Sie zu einer nicht eckigen Seite? Wenn ja, benutze browser.ignoreSynchronization = true; und ändern Sie es dann zurück in false, wenn Sie zu der eckigen Seite zurückkehren. – KCaradonna

+0

@KCaradonna Nein, es ist eine eckige Seite. Arbeiten an einer eckigen Anwendung für eine Seite – Wishnu

+2

Versuchen Sie stattdessen, browser.driver.getCurrentUrl() zu verwenden und die Ergebnisse zu posten. – KCaradonna

Antwort

4

In einer idealen Welt, sollten Sie keine Wartezeiten hinzufügen und Protractor sollte natürlich warten, bis Angular bereit sein und im Allgemeinen synchron damit arbeiten.

In einer realen Welt ist es leider oft notwendig Wartezeiten hinzuzufügen. Allerdings bevorzugen explizite Wartezeiten mit bestimmten Bedingungen zu hartcodierten browser.sleep() Anrufe, die in der Regel vermieden werden sollten. In diesem Fall können wir eine Wartezeit hinzufügen, um auf eine bestimmte URL zu warten, siehe this answer.

+0

Danke! Wann man '.then' und wann nicht benutzt. Implizit wartet der Protractor darauf, dass alle asynchronen Prozesse abgeschlossen sind, oder? Also 'pageObject.click(); expect (wahr) .toBe (wahr) 'ist gleich pageObject.click(). then (function() {expect (wahr) .toBe (true)})'. Ist mein Verständnis korrekt? – Wishnu

+1

@ Vishnu Yup, müssen Sie in der Regel nicht die Versprechen zu lösen, wenn Winkelmesser Tests schreiben. Sie werden in die Kontrollflusswarteschlange gestellt. Weitere Informationen finden Sie hier: https://github.com/angular/protractor/blob/master/docs/control-flow.md. Aber auch in Ecken, die 'then()' verwenden, können Timing-Probleme behoben werden. – alecxe

+0

+1 für den Link. Was wäre ein Eckfall der Verwendung von 'then'. Immer wenn ich 'browser.get' verwende, musste ich' browser.sleep' verwenden, obwohl die Seite eckig ist. – Wishnu

1

Das Problem hier ist nicht von browser.getCurrentUrl(), Das Stück läuft gut, wie Sie in dem Test erwähnt, der korrekt ausgeführt wird.

Winkelmesser gibt Ihnen einen großen Hinweis, wenn es Ihnen Timed out waiting for Protractor to synchronize with the page after 11 seconds sagt, das ist seine Art zu sagen, dass es Ihre eckige Seite nicht erfassen konnte - oder Ihre eckige Seite nie fertig geladen an erster Stelle, um die Testausführung zu nehmen voraus. Dies passiert, wenn Sie entweder eine Menge $timeout s oder übermäßige Abfragen auf Ihrer Seite verwenden. Um dieses Problem zu debuggen, führen Sie Ihre Testklage mit jasmine-spec-reporter und es wird Ihnen berichten, welche Funktion die Seite wartet (die die Synchronisierung blockieren)

0

[Ich sah dies in Bezug auf andere Fragen woanders, glaube ich Paketüberfluss. Es ist nicht original] Was ich habe, ist getan.

var EC, elm;//I have these as globals, because the issue arises a lot 

EC = protractor.ExpectedConditions; 

//after your click 

elm = element(by.linkText('Logout'));//on menu at top, helps timing, 
//your next page may vary, but we have Logout only after you log in 

browser.wait(EC.presenceOf(elm), 20000); 
expect(e2.isPresent()).toBeTruthy(); 
expect(browser.getCurrentUrl()).toContain("data_entry");//where I say 
//data_entry you would say 
//home 

Wenn Sie denken, dass es schlechter Stil ist, mehrere Erwartungen zu haben, ich vermute, Sie überbrückte die erste entfernen konnte. HTH