En una especificación de prueba, necesito hacer clic en un botón en una página web y esperar a que la nueva página se cargue por completo.
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
fuente
fuente
Respuestas:
Dependiendo de lo que quieras hacer, puedes probar:
browser.waitForAngular();
o
btnLoginEl.click().then(function() { // do some stuff });
para resolver la promesa. Sería mejor si pudiera hacerlo en el
beforeEach
.NB: Me di cuenta de que el esperar () espera a que se resuelva la promesa dentro (es decir, getCurrentUrl) antes de comparar.
fuente
browser.driver.sleep(1000)
como se sugiere a continuación hizo el truco.waitForAngular()
no debe utilizarse . Acerca declick().then()
que no funcionó para mí. Solo podía confiar enbrowser.wait(//use of protractor.ExpectedConditions)
.Acabo de echar un vistazo a la fuente: Protractor está esperando Angular solo en algunos casos (como cuando
element.all
se invoca o configura / obtiene la ubicación).Entonces Protractor no esperará a que Angular se estabilice después de cada comando.
Además, parece que a veces en mis pruebas tuve una carrera entre el ciclo de resumen angular y el evento de clic, así que a veces tengo que hacer:
usando sleep para esperar la ejecución para ingresar al contexto AngularJS (desencadenado por un
click
evento)fuente
expect
. En otros casos utilizo explícitamentewaitForAngular
.element(by.css('my-css')).click()
. Parece que el .click NO está esperando, aunque se devuelve una promesa.return elm.click().then(function () { return nextAction(); }
No es necesario esperar. El transportador espera automáticamente a que angular esté listo y luego ejecuta el siguiente paso en el flujo de control.
fuente
waitForAngular()
se llama internamente, pero también tuve que llamarlo para algunas especificaciones.browser.get
, dice explícitamente que existe para sobrescribir lo que envuelve. Si no hay unclick
método paraElementFinder
, entonces parece que solo delega enwebDriver.WebElement
. angular.github.io/protractor/#/api?view=ElementFinderCon transportador, puede utilizar el siguiente enfoque
Entonces su código se verá algo así como,
Nota: Esto puede no significar que la nueva página haya terminado de cargarse y que DOM esté listo. La siguiente declaración 'espera ()' asegurará que Transportador espere a que DOM esté disponible para la prueba.
Referencia: condiciones esperadas del transportador
fuente
En este caso, puede utilizar:
Objeto de página:
Prueba de página:
fuente
Por lo general, solo agrego algo al flujo de control, es decir:
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(); }
fuente
Usa esto, creo que es mejor
Para que pueda utilizar esta configuración de isAngularSite, debe poner esto en su protractor.conf.js aquí:
fuente
puedes hacer algo como esto
emailEl.sendKeys('jack'); passwordEl.sendKeys('123pwd'); btnLoginEl.click().then(function(){ browser.wait(5000); });
fuente
para resolver la promesa.
fuente