2015-01-21 12 views
6

Jestem nowy na kątomierz i próbuję przetestować zdarzenia popover, tutaj jest mój kod:Jak wytłumaczyć używając browser.sleep w kątomierz

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.If nie mam dodać opóźnienia kodu czasowego jak browser.sleep(), test nie powiedzie się i wyświetla komunikat:

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

to możliwe, aby nie dodawać opóźnienia kodu czasu ... jak browser.sleep()? Jeśli to niemożliwe, jak ma sens ustawienie czasu snu? Czy to ma jakiś związek z animacjami CSS?

2.Użycie numeru browser.waitForAngular() lub click().then(function(){...}) zamiast browser.sleep() wydaje się nie działać, zostanie wyświetlony ten sam komunikat o błędzie.

Byłoby świetnie, gdyby ktoś mógł odpowiedzieć na te pytania, wielkie dzięki.

Odpowiedz

8

Powodem, dla którego musieliście dodać sen, jest prawdopodobnie z powodu waszej animacji. Wiele animacji używa, o których Angular (a więc Kątomierz) nie wie i nie czeka. Kątowy odpowiednik setTimeout jest jego usługą $timeout.

Jednak często nie można zmienić biblioteki animacji, aby przestać używać setTimeout. Aby pracować z tym w kątomierzu, należy użyć browser.wait z limitem czasu (bez uśpienia).

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

Z Kątomierz 1.7, będzie można korzystać z biblioteki expectedConditions więc można to zrobić:

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

dziękuję @ Hankduan. Ta odpowiedź pomaga mi w końcu to zrozumieć i po prostu nie mogę się doczekać, aby zobaczyć Protractor 1.7! – Kiry

+0

Użyłem powyżej, ale zauważyłem, że element nie występuje w bloku oczekiwania kodu. Jak sprawdzić, czy animacja jest załadowana? – EnugulaS

0

zamiast przy użyciu przeglądarki, zadeklarować instancję kątomierza:

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

Następnie użyj:

ptor.get 

zamiast przeglądarce.

+0

dzięki, ale nie jestem po prostu chcą zamiast „przeglądarki” przez ptor, Naprawdę chcę usunąć "browser.sleep()" z mojego kodu. – Kiry

+0

ptor.ignoreSynchronization = true; pozwoli ci to zrobić – Ziwdigforbugs

+2

Użycie 'browser.ignoreSynchronization = true;' nie pozwoli ci na magiczne usunięcie instrukcji sleep. To stwierdzenie jest jedynym celem, jeśli pracujesz z nie-kątową aplikacją i ** nigdy nie musisz dodawać go do kanciastych aplikacji. – hankduan

Powiązane problemy