jasmine - tag - google analytics tracker
Transportador: ¿Cómo esperar a que se complete la página después de hacer clic en un botón? (9)
Acabo de echar un vistazo a la fuente: el transportador está esperando Angular solo en algunos casos (como cuando se invoca element.all
, o la configuración / ubicación).
Así que 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 digestión angular y el evento de clic, por lo que a veces tengo que hacer:
elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();
usando el modo de espera para esperar a que la ejecución ingrese en el contexto de AngularJS (activado por un evento de click
).
En una especificación de prueba, debo hacer clic en un botón en una página web y esperar a que la nueva página esté completamente cargada.
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'');
Con Protractor, puede utilizar el siguiente enfoque
var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains(''newPageName''), 10000);
Así que su código se verá algo así como,
emailEl.sendKeys(''jack'');
passwordEl.sendKeys(''123pwd'');
btnLoginEl.click();
var EC = protractor.ExpectedConditions;
// Wait for new page url to contain efg
ptor.wait(EC.urlContains(''efg''), 10000);
expect(ptor.getCurrentUrl()).toEqual(url + ''abc#/efg'');
Nota: Esto puede no significar que la nueva página ha terminado de cargarse y DOM está listo. La siguiente declaración ''expect ()'' asegurará que el Transportador espere a que DOM esté disponible para la prueba.
Referencia: Conductor ExpectedConditions
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 pudieras hacer eso antes de beforeEach
.
NB: Noté que el expect () espera que la promesa interna (es decir, getCurrentUrl) se resuelva antes de comparar.
En este caso, puede utilizar:
Objeto de página:
waitForURLContain(urlExpected: string, timeout: number) {
try {
const condition = browser.ExpectedConditions;
browser.wait(condition.urlContains(urlExpected), timeout);
} catch (e) {
console.error(''URL not contain text.'', e);
};
}
Prueba de página:
page.waitForURLContain(''abc#/efg'', 30000);
No necesitas esperar. El transportador espera automáticamente a que esté listo el ángulo y luego ejecuta el siguiente paso en el flujo de control.
Por lo general, simplemente 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();
}
Usa esto creo que es mejor
*isAngularSite(false);*
browser.get(crmUrl);
login.username.sendKeys(username);
login.password.sendKeys(password);
login.submit.click();
*isAngularSite(true);*
Para que use esta configuración de isAngularSite, debe poner esto en su protractor.conf.js aquí:
global.isAngularSite = function(flag) {
browser.ignoreSynchronization = !flag;
};
puedes hacer algo como esto
emailEl.sendKeys(''jack'');
passwordEl.sendKeys(''123pwd'');
btnLoginEl.click().then(function(){
browser.wait(5000);
});
browser.waitForAngular();
btnLoginEl.click().then(function() { Do Something });
Para resolver la promesa.