javascript - img - ¿Qué es browser.ignoreSynchronization en transportador?
title label html (2)
Esta configuración controla si el transportador debe esperar angular en una página o no. No está debidamente documentado, pero aquí está la cadena de documentación del código :
/**
* If true, Protractor will not attempt to synchronize with the page before
* performing actions. This can be harmful because Protractor will not wait
* until $timeouts and $http calls have been processed, which can cause
* tests to become flaky. This should be used only when necessary, such as
* when a page continuously polls an API using $timeout.
*
* @type {boolean}
*/
En otras palabras, si está probando en un sitio no angular, establezca la configuración
ignoreSynchronization
en
true
.
Como ejemplo del mundo real, vea uno de los desafíos que tuve al abrir una página no angular desde una página angular: la página
no angular se abrió después de un clic
.
Lo he visto muchas veces donde la gente sugiere usar:
browser.ignoreSynchronization=true; // or false
Pero no entiendo por qué lo necesitamos?
La respuesta simple es que hace que el transportador no espere a que se resuelvan las promesas de Angular, como las de
$http
o
$timeout
, que es posible que desee hacer si está probando el comportamiento durante
$http
o
$timeout
(por ejemplo, un "cargando "mensaje), o probar sitios o páginas no angulares, como una página de inicio de sesión separada.
Por ejemplo, para probar un botón que establece un mensaje de carga durante una solicitud, puede establecerlo en
true
al recuperar un elemento + verificar su contenido
element(by.css(''button[type="submit"]'')).click();
browser.ignoreSynchronization = true;
expect(element(by.css(''.message'')).getText().toBe(''Loading...'');
browser.ignoreSynchronization = false;
expect(element(by.css(''.message'')).getText().toBe(''Loaded'');
Una respuesta más complicada es que establecerlo en
true
significa que las adiciones / inyecciones posteriores al flujo de control no agregan también
browser.waitForAngular
.
Hay casos en los que es importante comprender el flujo de control y cuándo / cómo se agregan / inyectan las cosas.
Por ejemplo, si está usando
browser.wait
para probar un proceso de varias etapas, la función pasada a
wait
se inyecta en el flujo de control
después de que
el resto de las funciones de la prueba se hayan agregado al flujo de control.
element(by.css(''button[type="submit"]'')).click();
browser.ignoreSynchronization = true;
expect(element(by.css(''.message'')).getText().toBe(''Stage 1'');
browser.wait(function () {
// This function is added to the control flow after the final
// browser.ignoreSynchronization = false in the test
// so we need to set it again here
browser.ignoreSynchronization = true;
return element(by.cssContainingText(''.message'', ''Stage 2'')).isPresent().then(function(isPresent) {
// Cleanup so later tests have the default value of false
browser.ignoreSynchronization = false;
return !isPresent;
});
});
expect(element(by.css(''.message'')).getText().toBe(''Stage 2'');
browser.ignoreSynchronization = false;
expect(element(by.css(''.message'')).getText().toBe(''Stage 3'');
Una alternativa al uso de
browser.ignoreSynchronization
es acceder directamente a la API estándar de webdriver
element(by.css(''button[type="submit"]'')).click();
expect(browser.driver.findElement(by.css(''.message'')).getText().toBe(''Loading...'');
expect(element(by.css(''.message'')).getText().toBe(''Loaded'');
El uso de los métodos del controlador directamente para encontrar los elementos significa que el sistema intentará encontrarlos sin esperar a que finalicen las solicitudes
$http
curso, al igual que establecer
browser.ignoreSynchronization = true
.