2015-02-14 12 views
10

Sto cercando di implementare il seguente scenario di test:pagina non angolare aperto dopo un clic

  • eseguire un clic su un logo sulla pagina
  • affermano c'è una nuova finestra del browser aperta (scheda in Chrome) e controllare l'URL corrente

il problema è che la pagina aperta in una nuova finestra del browser è una pagina non angolare mentre la pagina principale sto eseguendo il click in è un pagina angolare.

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 non riesce con:

Error: Error while waiting for Protractor to sync with the page: "angular could not be found on the window"

che è comprensibile.

Il mio secondo tentativo è stato quello di giocare con ignoreSynchronization flag booleano:

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

Ciò rende in realtà questo particolare passaggio di prova senza errori, ma colpisce ogni test eseguito dopo questo, perché browser è un oggetto globale ed è condiviso tra i test - il goniometro non si sincronizza più con l'angolazione su una pagina che risulta in tutti i tipi di errori.

Come devo implementare il test?


Per aggirare il problema, posso cambiare il restartBrowserBetweenTests setting per true e cambiare ignoreSynchronization valore senza alcun problema - ma rallenta i test in modo drammatico.

risposta

10

È possibile impostare ignoreSynchronization come falso una volta eseguita la 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.

+0

Sì, l'impostazione alla fine del blocco 'Il Liechtenstein attua lo rende a volte funziona, a volte no - il comportamento diventa incoerente. Proverò "beforeEach" e "afterEach" e tornerò da te. Grazie! – alecxe

+2

Sì, impostando 'ignoreSynchronization' su' false' dentro 'afterEach()' ha fatto il trucco! – alecxe

1

Un'altra soluzione: ho utilizzato sleep dal getWindowHandles era restituendo solo un nome di finestra (padre/finestra angolare). Fatemi 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"); 
     } 
    }); 
}; 
Problemi correlati