2015-12-15 12 views
6

Piszę testy automatyzacji Kątomierza i napotkałem problem. Wait command nie czeka na jeden z elementów tablicy. Zobacz przykład poniżej: Próbuję poczekać na pierwszy element po przejściu na stronę.Kątomierz: "wait" nie działa z "element.all"

var category = element.all(by.repeater('category in listCtrl.categories')); 
var category2 = $$('.category-name.custom-tooltip-link.ng-binding'); 
var EC = protractor.ExpectedConditions; 

describe('wait for the first category', function() { 

    it('wait', function() { 
     browser.get('http://www.deep.mg/'); 

     browser.wait(EC.visibilityOf(category.get(0)), 20000); 

     browser.wait(EC.visibilityOf(category2.get(0)), 20000); 
    }); 
}); 

Ale test kończy się niepowodzeniem z następującym błędem: Failed: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator by.repeater("category in listCtrl.categories").

Błąd nie zależy od typu lokalizatora, ponieważ pojawia się dla obu: "by.repeater" i "by.css". Selektory są ok, test przechodzi po dodaniu polecenia „Sleep”:

var category = element.all(by.repeater('category in listCtrl.categories')); 
var category2 = $$('.category-name.custom-tooltip-link.ng-binding'); 
var EC = protractor.ExpectedConditions; 

describe('wait for the first category', function() { 

    it('wait', function() { 
     browser.get('http://www.deep.mg/'); 

     browser.sleep(15000); 

     browser.wait(EC.visibilityOf(category.get(0)), 20000); 

     browser.wait(EC.visibilityOf(category2.get(0)), 20000); 

     category.count().then(function(count1) { 
      console.log(count1); //count returns 5, which means there are actually elements in array 
     }); 

     category2.count().then(function(count2) { 
      console.log(count2); 
     }); 
    }); 
}); 

Timeout także parametr nie pomaga, po prostu ignoruje go i nie od razu.

Pytanie więc, jak poczekać na określony element tablicy? Czy czegoś brakuje? Dzięki.

+0

Czy odpowiedź była pomocna? Dzięki. – alecxe

+0

@alecxe tak, ma. Dziękuję Ci! –

Odpowiedz

8

Zrób zwyczaj Oczekiwany Stan czekać na liczby elementów w tablicy będzie więcej niż 0:

function presenceOfAll(elementArrayFinder) { 
    return function() { 
     return elementArrayFinder.count(function (count) { 
      return count > 0; 
     }); 
    }; 
} 

Zastosowanie:

browser.wait(presenceOfAll(category), 10000); 
browser.wait(presenceOfAll(category2), 10000); 

pracuje dla mnie.

+0

Dzięki @alecxe to był problem dla mnie. czy cały czas używamy ElementFinder OR tylko wtedy, gdy pojawi się błąd StaleReference? – DDave

+0

@DDave Chciałbym rozważyć użycie go jako rodzaj warstwy dodawania niezawodności wstrzykiwania go do problematycznych miejsc w testach. Cieszę się, że pomogło! – alecxe

+1

W moim przypadku musiałem przedłużyć odpowiedź. Funkcja oddzwaniania (liczba) ... nie jest w ogóle brana pod uwagę. Pozostawienie pustego pola prowadzi do tego samego wyniku. Jak count zwraca obietnicę, której musisz użyć. Następnie polub ten element: 'return elementArrayFinder.count(). Then (function count() {... // sprawdź tutaj})) – ilmgb

2

element.all(by.repeater('category in listCtrl.categories')).get(0) będzie zawsze wygeneruje błąd, jeśli nie ma elementów do 'get' (źródło: element.js ElementArrayFinder.prototype.get)

można zrobić:

browser.wait(function() { 
    return category.count().then(function(catCount) { 
     if (catCount > 0) { 
      return EC.visibilityOf(category.get(0)); 
     } 
    } 
}, 20000); 

Albo można prawdopodobnie po prostu poczekaj, aż wszystkie elementy będą widoczne, i zrobiłby to, o co prosisz (ponieważ będzie czekać aż "wszystkie" obietnice całkowicie się rozwiążą, a nie tylko wyskoczy, gdy otrzyma pierwszą):

browser.wait(EC.visibilityOf(category), 20000); 
Powiązane problemy