javascript - quiniela - ¿Cómo tener resultados confiables del transportador?
loto nacional (4)
Cada vez que tengo problemas similares, estoy usando browser.wait()
con "Condiciones Esperadas" ( introducido en el transportador 1.7 ). Existe un conjunto de condiciones esperadas incorporadas que, por lo general, es suficiente, pero puede definir fácilmente las condiciones esperadas personalizadas.
Por ejemplo, esperando que un elemento se vuelva visible :
var EC = protractor.ExpectedConditions;
var e = element(by.id(''xyz''));
browser.wait(EC.visibilityOf(e), 10000);
expect(e.isDisplayed()).toBeTruthy();
Algunas notas:
puede especificar un mensaje de error personalizado en caso de que las condiciones no se cumplan y se produzca un error de tiempo de espera, consulte el mensaje personalizado en el error de espera de tiempo de espera :
browser.wait(EC.visibilityOf(e), 10000, "Element ''xyz'' has not become visible");
puede configurar
EC
para que sea una variable disponible en todo el mundo que apunte aprotractor.ExpectedConditions
. Agregue esta línea aonPrepare()
en su configuración:onPrepare: function () { global.EC = protractor.ExpectedConditions; }
como ejemplo de una condición esperada personalizada, vea esta respuesta
Estoy usando Protractor (v 1.3.1) para ejecutar pruebas E2E para mi aplicación Angular 1.2.26.
Pero a veces, las pruebas están bien, a veces no. Parece que a veces la comprobación se realiza antes de que se actualice la pantalla (o algo así como un problema de "sincronización"). Intento muchas opciones:
- agregar instrucciones de
browser.driver.sleep
, - desactivar efectos con
browser.executeScript(''$.fx.off = true'')
- agregar las instrucciones de
browser.waitForAngular()
sin éxito.
¿Cuáles son las mejores prácticas para tener pruebas fiables de E2E con transportador?
JM.
Hay dos cosas a considerar.
La primera es que debe secuenciar adecuadamente todas las acciones del transportador (como también lo insinuó @ jmcollin92). Para esto, normalmente utilizo .then
en cada paso.
La segunda cosa importante es asegurarse de que una nueva prueba it(...)
solo comience después de que la anterior it(...)
haya completado.
Si usa la última versión de Protractor, puede usar Jasmine 2.x y su compatibilidad para indicar que se ha completado una prueba:
it(''should do something'', function(done) {
clicksomething().then(function() {
expect(...);
done();
});
});
Aquí se invoca el argumento done
para indicar que la prueba está lista. Sin esto, clicksomething
programará el comando clicksomething
y luego continuará inmediatamente con la siguiente prueba, volviendo a la prueba actual solo una vez que se haya completado un clicksomething
.
Como normalmente ambas pruebas inspeccionan y posiblemente modifiquen el mismo navegador / página, sus pruebas se vuelven impredecibles si las deja pasar simultáneamente (una prueba hace clic en la página siguiente, mientras que otra sigue inspeccionando la página anterior).
Si utiliza una versión anterior de Transportador (1.3 como usted indica), el Jazmín 1.3 se runs
y waitsFor
funciones se puedan usar para simular este comportamiento.
Tenga en cuenta que el objetivo de usar un transportador es que se supone que el transportador debe saber cuándo finaliza Angular. Por lo tanto, en principio, no debería haber ninguna necesidad de llamar a waitForAngular
(mi propio conjunto de pruebas con docenas de escenarios no incluye un solo wait / waitForAngular). Cuanto mejor se WaitForAngular
su aplicación bajo prueba a los principios de diseño de Angular, menos WaitForAngular
necesitará.
Otro punto que es muy importante en las pruebas con Transportador es comprender el ControlFlow. Puede encontrar explicaciones y ejemplos de códigos aquí: ¿ Cuándo deberíamos usar .then con Protractor Promise?
Jean-marc
Yo agregaría que deshabilitar ngAnimate puede no ser suficiente. También es posible que deba deshabilitar todas las animaciones de transición al inyectar CSS ( ¿Cuál es la forma más limpia de desactivar los efectos de transición de CSS temporalmente? ).