告诉量角器阻止异步调用

时间:2014-06-16 08:33:10

标签: javascript angularjs selenium protractor

我在传统应用中添加了一个全新的,有角度的客户端层。登录后,旧版重定向到“家”。网址。该网址包含一个会话ID,我需要抓取并使用(在网址中)任何后续的获取/帖子。登录后我致电:

browser.getCurrentUrl()

然后使用正则表达式提取会话ID。我将会话ID存储起来并将其用于以后的获取/发布。

问题是虽然browser.getCurrentUrl()返回一个promise,我的所有测试都运行后才能获得会话ID。如何让量角器等待browser.getCurrentUrl()来解析。

特别是在我有代码的地方:

var sessionId = loginPage.login('testuser@example.com', 'testuser');
homePage = new HomePage(sessionId);

我真的需要在loginPage.login()上阻止所有代码,所以我会定义一个会话ID。我的主页测试和任何其他页面测试都需要会话ID才能正常运行。

如何在量角器中实现这一目标?

谢谢!

我的代码的相关部分看起来像这样......

home.spec.js:

describe('home page tests', function() {
  var loginPage = new LoginPage();
  var homePage;

  // get sessionId from login and create a new HomePage object from it
  beforeEach(function() {
    var sessionId = loginPage.login('testuser@example.com', 'testuser');
    homePage = new HomePage(sessionId);
    homePage.get();
  });

  describe('main elements of home page test', function() {    
    it('page has correct username as part of user menu', function() {
      expect(homePage.getUsername()).toEqual('testuser@example.com');
    });
  });
});

login.po.js:

function LoginPage {

  // ...snip...

  this.login = function(username, password) {
    return this.get()
      .then(function() {
        this.username.sendKeys(username);
        this.password.sendKeys(password);

        this.loginButton.click();
      })
      .then(function() {
        return browser.getCurrentUrl().then(function(url) {
          var groups = sessionIdRegex.exec(url);

          // return the extracted session id or null if there is none
          if (groups !== null) {
            return sessionIdRegex.exec(url)[2];
          } else {
            return null;
          }
        });
      });
  };
}

home.po.js:

function HomePage(sessionId) {
  this.username = element(by.binding('username'));

  this.getUsername = function() {
    return this.username.getText();
  }

  this.get = function() {
    return browser.get(browser.baseUrl + sessionId + '#/home');
  };
};

module.exports = HomePage;

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用expect

  

茉莉花的期望也适应了解承诺。这就是行

的原因      

`expect(name.getText())。toEqual(' Jane Doe');

     

工作 - 这段代码实际上向控制流添加了一个期望任务,该任务将在其他任务之后运行。

login.po.js:

function LoginPage {

  this.login = function(username, password) {
    return this.get()
      .then(function() {
        this.username.sendKeys(username);
        this.password.sendKeys(password);

        this.loginButton.click();
      })
      .then(function() {
        return browser.getCurrentUrl().then(function(url) {
          var groups = sessionIdRegex.exec(url);

          // return the extracted session id or null if there is none
          if (groups !== null) {
            return sessionIdRegex.exec(url)[2];
          } else {
            return null;
          }
        });
      });
  };
  expect(this.login).not.toBeUndefined();
}