1

afterEach を使用してログアウトしますが、afterEach がログアウトを完了する前にテストがログインを試みます。

私は sleep ステートメントの使用を避けようとしています (本当に遅くなります)。

前の beforeEach が終了するまでテストを待機させるにはどうすればよいですか?

コード スニペット:

afterEach(function() {
    AccountBlock.logout().then(function(){
        browser.sleep(2000); // I want to get rid of this
    });
});

logout() メソッド (AccountBlock オブジェクトから):

this.logout = function() {
    var logoutLink = this.logoutLink;
    var userName = this.userName;
    return logoutLink.isDisplayed().then(function(isDisplayed){
        if (!isDisplayed) {
            return userName.click().then (function() {
                return logoutLink.click();
            }); // open the account menu before logout
        } else { // account menu already displayed
            return logoutLink.click();
        }
    });
}
this.userName = element(by.css('a[ng-bind="userName"]'));
this.logoutLink = element(by.css('a[ng-click^="logout"]'));
4

2 に答える 2

1

browser.wait は間違いなく進むべき道ですが、要素を直接呼び出して要素が存在するか表示されているかを尋ねるのではなく、分度器にはこれだけの機能が組み込まれており、これはExpectedConditionsと呼ばれます。これを使用して、分度器を使用して、ブラウザーが独自の期待される条件に一致するまでブラウザーを強制的に待機させることができます。

以下では、予想される条件を使用して要素の存在を検出し、not 演算子を使用して要素が存在しなくなったことを検出して、要素を見つけています。これにより、 browser.wait は、その条件が true になるまで将来の promise を一時停止する必要があります。

afterEach(function(){
    var ec = protractor.ExpectedConditions;
    var logout = element(by.css('a[ng-click^="logout"]'));
    var logoutLink = ec.presenceOf(logout);
    var logoutLinkNotThereAnymore = ec.not(logoutLink);

    //do logout
    browser.wait(logoutLinkNotThereAnymore, 10000, "Waited 10 seconds");
});

beforeEach(function(){
    //do login
});
于 2016-11-30T19:41:33.197 に答える
0

私は browser.wait() を使用して sleep() を回避します。コードのログインブロックでこれを行うことができます

   var doLogin = function(){
           browser.wait(element(by.id('yourLoginBoxId')).isDisplayed); //this will wait until the html with the form to login is in your DOM
          //your code to login here
      };

isDisplayed には () がないことに注意してください。

于 2015-01-13T15:14:24.270 に答える