2015-06-17 8 views
5

Chcę użyć funkcji browser.wait, aby wielokrotnie sprawdzać, czy element przycisku jest obecny przez określony czas, a następnie użyć odpowiedniego wywołania zwrotnego. Poniżej mam kod, który nie używa czekania.Co Protractor browser.wait zwraca, jeśli warunek nigdy nie staje się prawdziwy?

detailsButton.isPresent() 
    .then(function(present){ 
     if(!present) { 
      callback(); 
     } else { 
      callback(new Error('The details button was not present.')); 
     } 
    }); 

Chciałbym pomóc w naprawie tego kodu, ponieważ nie jestem pewien, jak funkcja wait radzi sobie z falure/timeout. Zasadniczo pytam, co powinno być w ". Then" części poniższego kodu, który jest mniej przylegający do tego, co mam obecnie.

browser.driver.wait(function(){ 
    return pgTransactionHistory.transactionHistoryDetails.isPresent(); 
}, 60000).then(function(){ 
    pgTransactionHistory.transactionHistoryDetails.isPresent() 
     .then(function(present){ 
      if(!present) { 
       callback(); 
      } else { 
       callback(new Error('The details button was not present.')); 
      } 
     }); 
}); 

Dziękujemy!

Odpowiedz

9

Istnieją dwa sposoby, aby to zrobić: pierwsze można użyć trzeci argument browser.wait na sznurku, który zostanie wysłany jako komunikat o błędzie. Tak:

browser.driver.wait(function(){ 
    return //condition 
}, timeout, 'Error message string') 
    .then(function(){ 
     callback(); 
    }); 

Lub po drugie stosując drugi argument .Następnie tak:

browser.driver.wait(function(){ 
    return //condition 
}, timeout) 
    .then(function(){ 
     callback(); 
    }, function(){ 
     //code to want to execute on failure. 
    }); 
+0

Dlaczego kątomierz nie tylko odrzuca błąd i kończy go w procedurze obsługi .catch? – Abdel

1

Funkcja oczekiwania odrzuca po przekroczeniu limitu czasu. To znaczy - zwraca obietnicę, a po przekroczeniu limitu czasu odrzuca ją.

browser.driver.wait(function(){ 
    return pgTransactionHistory.transactionHistoryDetails.isPresent(); 
}, 60000).then(function(){ 
    callback(); // instead of doing this, you should return a promise 
}).catch(function(){ 
    callback(new Error('The details button was not present.')); 
}); 
+0

Dzięki za odpowiedź! Z jakiegoś powodu dodanie funkcji .catch() powoduje błąd: "undefined nie jest funkcją." Kiedy zostawiam chwyt, działa bez problemów, poza oczywiście nic nie zostanie "złapane". – JasoonS

+0

Ok, więc w jaki sposób mam go do pracy jest użycie trzeciego parametru browser.wait, który jest ciągiem znaków, który zostanie użyty jako komunikat o błędzie. Wydaje się, że powinienem czytać dokumenty ostrożniej ... Nie jestem pewien, dlaczego catch nie działa. – JasoonS

1

Ponieważ kątomierz daje możliwość pisania operacji asynchronicznych synchroniczny, możliwe jest również, aby obsługiwać przeglądarkę. czas oczekiwania w bardziej synchroniczny sposób.

export class AppPage { 

    public static isLoaded() { 
    return browser 
    .wait(until.presenceOf(by.id('myID')), 5000) 
    .then(() => true,() => false); 
    } 
} 

i używać go w swojej e2e.spec następująco:

expect(AppPage.isLoaded()).toBeTruthy(); 
+0

Kiedy to działa, zastanawiam się, co "oczekuje" pod maską i czy będzie to blokować wątek, czy nie. – Abdel

Powiązane problemy