Qué es el navegador.ignoreSynchronization en transportador?


Lo he visto tantas veces donde la gente sugiere usar:

browser.ignoreSynchronization=true;  // or false

, Pero no entiendo por qué lo necesitamos?

Author: Priyanshu Shekhar, 2015-03-02

2 answers

La respuesta simple es que hace que protractor no espere a que las promesas de Angular, como las de $http o $timeout se resuelvan, lo que puede que desee hacer si está probando el comportamiento durante $http o $timeout (por ejemplo, un mensaje de "carga"), o probando 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 configurarlo en true al obtener 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'); 

A más la respuesta involucrada es que es que configurarlo en true significa que las adiciones/inyecciones posteriores al flujo de control no también agregan browser.waitForAngular. Hay casos en los que es importante comprender el flujo de control y cuándo/cómo se agregan/inyectan las cosas en él. Por ejemplo, si está utilizando 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 el resto de las funciones en la prueba se han agregado al control flujo.

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'); 

Usar los métodos del controlador directamente para encontrar los elementos significa que el sistema intentará encontrarlos sin esperar a que terminen las solicitudes $http en curso, al igual que configurar browser.ignoreSynchronization = true.

 68
Author: Michal Charemza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 08:09:56

Esta configuración controla si el transportador debe esperar a angular en una página o no. No está debidamente documentada, 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 con un sitio no angular, establezca 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: Página no angular abierta después de un clic.

 16
Author: alecxe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:04