javascript angularjs testing protractor end-to-end

javascript - Página no angular abierta después de un clic



angularjs testing (2)

Estoy tratando de implementar el siguiente escenario de prueba:

  • haga clic en un logotipo en la página
  • afirme que hay una nueva ventana del navegador abierta (pestaña en Chrome) y verifique la URL actual

El problema es que la página abierta en una nueva ventana del navegador es una página no angular, mientras que la página principal en la que estoy haciendo clic es una página angular .

Aqui esta mi primer intento:

it("should show logo", function () { var logo = scope.page.logo; expect(logo.isDisplayed()).toEqual(true); // opens a new page on click logo.click().then(function () { browser.getAllWindowHandles().then(function (handles) { browser.switchTo().window(handles[1]).then(function () { expect(browser.getCurrentUrl()).toEqual(''http://myurl.com/''); }); // switch back to the main window browser.switchTo().window(handles[0]); }); }); });

que falla con:

Error: Error al esperar que el transportador se sincronice con la página: "no se pudo encontrar angular en la ventana"

Lo cual es comprensible.

Mi segundo intento fue jugar con ignoreSynchronization boolean flag:

browser.ignoreSynchronization = true; logo.click().then(function () { browser.getAllWindowHandles().then(function (handles) { browser.switchTo().window(handles[1]).then(function () { expect(browser.getCurrentUrl()).toEqual(''http://myurl.com/''); }); // switch back to the main window browser.switchTo().window(handles[0]); });

Esto realmente hace que esta prueba en particular pase sin ningún error, pero afecta a todas las pruebas ejecutadas después de esta, porque el browser es un objeto global y se comparte entre las pruebas: el transportador ya no se sincroniza con angular en una página que da como resultado todo tipo de errores.

¿Cómo debo implementar la prueba?

Como solución alternativa, puedo cambiar la configuración de restartBrowserBetweenTests a true y cambiar el valor de ignoreSynchronization sin ningún problema, pero ralentiza drásticamente las pruebas.


Otra solución: he usado sleep desde que getWindowHandles solo devolvía un nombre de ventana (ventana principal / angular). Avísame si hay una mejor manera.

this.validateProductPageInfo = function (productTitle) { browser.sleep(5000); browser.getAllWindowHandles().then(function (handles) { if (handles.length === 2) { browser.switchTo().window(handles[1]).then(function () { var prodTitle = by.xpath(''//h1[@id="fw-pagetitle"]''); browser.driver.findElement(prodTitle).getText().then(function (text) { expect(text).toBe(productTitle); }); }); browser.switchTo().window(handles[0]); } else { console.log("Error in switching to non angular window"); } }); };


Puede configurar ignoreSynchronization para que sea falso una vez que se realice la verificación. Sin embargo, tenga en cuenta que ignoreSynchronization es síncrono, mientras que todo lo demás (hacer clic / obtener / etc.) es asíncrono, por lo que debe tener cuidado con eso. Probablemente la forma más segura es establecerlo como verdadero en beforeEach y false en afterEach, y simplemente probar ese solo clic del logotipo en esa prueba.