之后每个人都没有等到完成才继续

时间:2014-12-23 16:21:02

标签: angularjs testing jasmine protractor e2e-testing

我使用afterEach注销,但我的测试尝试在afterEach完成注销之前登录。

我试图避免使用睡眠声明(确实减慢了速度)。

如何进行测试以等待之前的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"]'));

2 个答案:

答案 0 :(得分:1)

browser.wait绝对是可行的方式,而不是直接调用元素来询问它们是否存在或显示量角器具有内置功能,仅用于此ExpectedConditions。你可以使用这个让量角器强制浏览器等到它满足它自己的预期条件。

下面我找到元素,使用预期条件检测元素的存在,然后使用not运算符检测元素何时不再存在。这应该强制browser.wait暂停未来的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
});

答案 1 :(得分: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没有()。