Pagina non angular aperta dopo un clic

Sto cercando di implementare il seguente scenario di test:

  • eseguire un clic su un logo sulla pagina
  • affermare che è stata aperta una nuova finestra del browser (scheda in Chrome) e controllare l’URL corrente

Il problema è che la pagina aperta in una nuova finestra del browser è una pagina non angular mentre la pagina principale su cui sto eseguendo il click è una pagina angular .

Ecco il mio primo tentativo:

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]); }); }); }); 

che fallisce con:

Errore: Errore durante l’attesa per il protractor per la sincronizzazione con la pagina: “angular non può essere trovato sulla finestra”

che è comprensibile.

Il mio secondo tentativo era di giocare con la bandiera booleana ignoreSynchronization :

 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]); }); 

In realtà, questo particolare test passa senza errori, ma influisce su tutti i test eseguiti dopo questo, perché il browser è un object globale e viene condiviso tra i test – il protractor non si sincronizza più con angular su una pagina che risulta in tutti i tipi di errori.

Come devo implementare il test?


Come soluzione alternativa, posso modificare l’ impostazione restartBrowserBetweenTests su true e modificare ignoreSynchronization value senza problemi, ma rallenta notevolmente i test.

È ansible impostare ignoreSynchronization in modo che sia falso al termine della verifica. Tuttavia, si noti che ignoreSynchronization è sincrono mentre tutto il resto (clic / get / etc) è asincrono, quindi è necessario fare attenzione. Probabilmente il modo più sicuro è impostarlo su true in beforeEach e false in afterEach e testare quel singolo logo in quel test.

Un’altra soluzione: ho usato sleep poiché getWindowHandles restituiva solo un nome di finestra (parent / angular window). Fammi sapere se c’è un modo migliore.

 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"); } }); };