w3schools img attribute javascript angularjs testing protractor end-to-end

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 .