2017-02-02 4 views
2

Ich teste eine Seite, die manchmal ein Widget, und manchmal auch ein anderes rendern wird.Warten auf ein Versprechen oder eine andere

Ich versuche browser.wait() zu verwenden, um sicherzustellen, dass eine der beiden gerendert hat, bevor Sie mit der entsprechenden interagieren, je nachdem, welche es ist.

Hier ist mein Code:

EC = protractor.ExpectedConditions 

browser.wait(() => { 
     return EC.presenceOf(userField) || EC.presenceOf(notMyAccountElement) 
}, WAIT_TIME, 'Lock form (auth0) never appeared.') 

notMyAccountElement.isPresent().then((result) => { 
    if (result) { 
    notMyAccountElement.click() 
    browser.wait(EC.presenceOf(userField), WAIT_TIME, 'New lock form (auth0) never appeared.') 
    } 
    userField.sendKeys(user) 
    passField.sendKeys(password) 
    submitBtn.click() 
}) 

Dies funktioniert in der Regel, aber ich bekomme intermittierende Ausfälle bei:

userField.sendKeys(user) 

ich im Browser sehen können, die gelegentlich diese Zeile ausgeführt wird, wenn es tatsächlich notMyAccountElement ist das ist auf der Seite vorhanden.

Ich denke, das wahrscheinlichste Problem ist, dass die Eröffnung browser.wait() ist nicht die Auflösung, wie ich es erwarte, aber ich würde gerne verstehen, warum.

Antwort

4

ich Sie denken, sind nicht die erwarteten Bedingungen richtig anwenden, müssen Sie EC.or() verwenden:

browser.wait(EC.or(EC.presenceOf(userField), EC.presenceOf(notMyAccountElement)), 
      WAIT_TIME, 'Lock form (auth0) never appeared.') 

Und da Sie mit userField interagieren, sollten Sie sein, wahrscheinlich die visibilityOf oder elementToBeClickable statt presenceOf mit erwartet Bedingung. Obwohl ich bezweifle, dass es mit den intermittierenden Fehlern zusammenhängt.

Sie können auch die Wartezeit vom Warten auf Anwesenheit/Sichtbarkeit von userField auf Unsichtbarkeit/Verfall der notMyAccountElement ändern. Ersetzen:

browser.wait(EC.presenceOf(userField), WAIT_TIME, 'New lock form (auth0) never appeared.'); 

mit:

browser.wait(EC.stalenessOf(notMyAccountElement), WAIT_TIME, 'New lock form (auth0) never appeared.'); 

Oder Sie beide, eins nach dem anderen verwenden kann, um die Dinge noch zuverlässiger zu machen.

+0

Dank @alecxe! Ich werde 'EC.or()' ausprobieren und zurück posten, wenn es meine Probleme löst. –

+0

Ich habe 'EC.or() 'für zwei Stunden ohne einen einzigen Fehler ausgeführt. Dies scheint der Zweck gewesen zu sein. Danke noch einmal! –

Verwandte Themen