In einer Testspezifikation muss ich auf eine Schaltfläche auf einer Webseite klicken und warten, bis die neue Seite vollständig geladen ist.
emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');
btnLoginEl.click();
// ...Here need to wait for page complete... How?
ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
jasmine
protractor
wait
Zach
quelle
quelle
Antworten:
Je nachdem, was Sie tun möchten, können Sie Folgendes versuchen:
browser.waitForAngular();
oder
btnLoginEl.click().then(function() { // do some stuff });
das Versprechen zu lösen. Es wäre besser, wenn Sie das in der tun können
beforeEach
.NB: Mir ist aufgefallen, dass Expect () darauf wartet, dass das Versprechen (dh getCurrentUrl) vor dem Vergleich gelöst wird.
quelle
browser.driver.sleep(1000)
wie unten vorgeschlagen hat den Trick getan.waitForAngular()
sollte nicht verwendet werden . Über das hatclick().then()
es bei mir nicht geklappt. Ich konnte mich nur darauf verlassenbrowser.wait(//use of protractor.ExpectedConditions)
.Ich habe mir gerade die Quelle angesehen - Winkelmesser wartet nur in wenigen Fällen auf Angular (z. B. wenn er
element.all
aufgerufen wird oder wenn der Standort festgelegt / abgerufen wird).Der Winkelmesser wartet also nicht darauf, dass sich Angular nach jedem Befehl stabilisiert.
Außerdem sieht es so aus, als hätte ich in meinen Tests manchmal ein Rennen zwischen dem Angular Digest-Zyklus und dem Klick-Ereignis gehabt, also muss ich manchmal Folgendes tun:
Verwenden Sie sleep, um auf die Ausführung zu warten, um in den AngularJS-Kontext zu gelangen (ausgelöst durch ein
click
Ereignis).quelle
expect
. In anderen Fällen verwende ich ausdrücklichwaitForAngular
.element(by.css('my-css')).click()
. Es scheint, dass der .click NICHT wartet, obwohl ein Versprechen zurückgegeben wird.return elm.click().then(function () { return nextAction(); }
Sie müssen nicht warten. Der Winkelmesser wartet automatisch darauf, dass der Winkel bereit ist, und führt dann den nächsten Schritt im Kontrollfluss aus.
quelle
waitForAngular()
intern aufgerufen wird, aber ich musste es auch für einige Spezifikationen nennen.browser.get
, sagt es ausdrücklich, dass es existiert, um das, was es umhüllt, zu überschreiben. Wenn es keineclick
Methode für gibtElementFinder
, dann scheint es, als würde es nur an die delegierenwebDriver.WebElement
. angle.github.io/protractor/#/api?view=ElementFinderMit Winkelmesser können Sie den folgenden Ansatz verwenden
Ihr Code sieht also ungefähr so aus:
Hinweis: Dies bedeutet möglicherweise nicht, dass die neue Seite vollständig geladen wurde und DOM bereit ist. Die nachfolgende Anweisung 'expected ()' stellt sicher, dass der Winkelmesser darauf wartet, dass DOM für den Test verfügbar ist.
Referenz: Winkelmesser ExpectedConditions
quelle
In diesem Fall können Sie Folgendes verwenden:
Seitenobjekt:
Seitentest:
quelle
Normalerweise füge ich dem Kontrollfluss einfach etwas hinzu, dh:
it('should navigate to the logfile page when attempting ' + 'to access the user login page, after logging in', function() { userLoginPage.login(true); userLoginPage.get(); logfilePage.expectLogfilePage(); });
logfilePage:
function login() { element(by.buttonText('Login')).click(); // Adding this to the control flow will ensure the resulting page is loaded before moving on browser.getLocationAbsUrl(); }
quelle
Verwenden Sie dies, ich denke, es ist besser
Damit Sie diese Einstellung von isAngularSite verwenden können, sollten Sie dies hier in Ihre protractor.conf.js einfügen:
quelle
Sie können so etwas tun
emailEl.sendKeys('jack'); passwordEl.sendKeys('123pwd'); btnLoginEl.click().then(function(){ browser.wait(5000); });
quelle
das Versprechen zu lösen.
quelle