2015-01-21 8 views
6

Sono un nuovo a goniometro, e sto cercando di testare evento popover, Ecco il mio codice:Come spiegare utilizzando browser.sleep in goniometro

describe('popover directive', function() { 
     var buttons= element.all(by.tagName('button')); 

     it('should show the popover title by clicking', function() { 
      var popTitle="testTitle";    
      var popContent="testContent";     

      element(by.model('title')).clear().sendKeys(popTitle);  
      element(by.model('content')).clear().sendKeys(popContent).then(function(){ 
       buttons.get(0).click().then(function(){ 
        browser.sleep(1000); 
        expect(element(by.className('popover-title')).getText()).toMatch(popTitle);     
        expect(element(by.className('popover-content')).getText()).toMatch(popContent); 
       });  
      });      
      buttons.get(0).click(); 
      browser.sleep(1000);  
      expect(element(by.css('[class="popover fade top in"]')).isPresent()).toBe(false);  
     }); 
    }); 

1. Se non lo faccio aggiungere il codice tempo di ritardo come browser.sleep(), il test fallirà e mostrare un messaggio:

NoSuchElementError: No element found using locator: By.className('popover-title') 

È che possibile non aggiungere il codice tempo di ritardo ... come browser.sleep()? Se ciò è impossibile, come avere senso impostare bene l'orario di sonno? Questo ha qualche connessione con le animazioni CSS?

2. L'utilizzo di browser.waitForAngular() o click().then(function(){...}) anziché browser.sleep() sembra non funzionare, riceverà lo stesso messaggio di errore.

Sarebbe bello se qualcuno potesse rispondere a queste domande, grazie mille.

risposta

8

Il motivo per cui è stato necessario aggiungere un sonno è probabilmente dovuto all'animazione. Molte animazioni usano setTimeout, che Angular (quindi Protractor) non conosce e non aspetta. L'equivalente angolare a setTimeout è il suo servizio $timeout.

Ma spesso non è possibile modificare la libreria di animazione per smettere di usare setTimeout. Per lavorare con questo in goniometro, utilizzare browser.wait con un timeout (non sleep).

buttons.get(0).click(); 

browser.wait(function() { 
    return element(by.css('[class="popover fade top in"]')).isPresent().then(function(present) { 
    return !present; 
    }); 
    // or by checking any other element to know that the animation completed 
}, 1000); 

expect(element(by.css('[class="popover fade top in"]')).isPresent()).toBe(false);  

Con goniometro 1.7, si sarà in grado di utilizzare la libreria expectedConditions in modo da poter fare questo:

var EC = protractor.ExpectedConditions 
buttons.get(0).click(); 

var e = element(by.css('[class="popover fade top in"]')); 
browser.wait(EC.not(EC.presenceOf(e)), 1000); 

expect(e.isPresent()).toBe(false); 
+0

grazie @hankduan. Questa risposta mi aiuta a capirlo finalmente, e non vedo l'ora di vedere Goniometro 1.7! – Kiry

+0

Ho usato sopra uno ma ho notato che l'elemento non è presente nel blocco di attesa del codice. Come controllare se l'animazione è stata caricata? – EnugulaS

0

invece di utilizzare il browser, dichiarare un'istanza di goniometro:

ptor = protractor.getInstance(); 
    ptor.ignoreSynchronization = true; 

Quindi utilizzare:

ptor.get 

invece di browser.

+0

grazie, ma io non sono solo voglia di invece di "browser" per PTOR, Voglio davvero rimuovere "browser.sleep()" dal mio codice. – Kiry

+0

ptor.ignoreSynchronization = true; ti consentirà di farlo – Ziwdigforbugs

+2

usando 'browser.ignoreSynchronization = true;' non ti permetterà di rimuovere magicamente la dichiarazione di sonno. L'unico scopo di questa affermazione è se stai lavorando con un'app non angolare e dovresti ** non ** doverlo aggiungere per le app angolari. – hankduan