使用带有Protractor的Page Object Model时,承诺无法解决

时间:2017-07-04 19:07:31

标签: javascript protractor

我正在尝试在我的项目中实现页面对象模型,但我无法让它工作。我想使用browser.getTitle()获取当前页面的标题,直接在 login.spec.js 中使用时效果很好,但在移动到 login.po时不起作用的.js 即可。以下是我目前的设置:

login.spec.js

var LoginPage = require('../../pages/user/login.po.js'),
    expect = require('chai').expect;

describe('Login', function() {
    var page;

    beforeEach(function () {
        page = new LoginPage();
    });

    it('should be able to get the page title', function() {
        expect(page.getLoginPageTitle).to.equal('Test');
    });
});

login.po.js

'use strict';

var LoginPage = function(){
    browser.get('http://localhost:3000/');
};

LoginPage.prototype = Object.create({}, {
    getLoginPageTitle: {get: function() {
        browser.getTitle().then(function(res){
            return res;
        });
    }}
});

module.exports = LoginPage;

我得到的错误:     AssertionError: expected undefined to equal 'Test'

经过进一步调查,我的login.po.js中的browser.getTitle()承诺似乎没有得到解决。

关于我做错的任何想法?该页面在Chrome中正确加载,Chrome会显示正确的网页标题。

2 个答案:

答案 0 :(得分:1)

你应该在PageObject中添加额外的回报。您将返回已解决的承诺browser.getTitle()的结果,但不会返回承诺本身,请参阅下文。

'use strict';

var LoginPage = function() {
  browser.get('http://localhost:3000/');
};

LoginPage.prototype = Object.create({}, {
  getLoginPageTitle: {
    get: function() {
      return browser.getTitle();
    }
  }
});

module.exports = LoginPage;

答案 1 :(得分:1)

最终想到它! (没有双关语)

我只需使用chai-as-promised以及使用wswebcreation的答案。这是我现在的设置:

login.spec.js

var LoginPage = require('../../pages/user/login.po.js'),
    chai = require('chai'),
    expect = require('chai').expect,
    chaiAsPromised = require('chai-as-promised');

chai.use(chaiAsPromised)

describe('Login', function() {
    var page;

    beforeEach(function () {
        page = new LoginPage();
    });

    it('should be able to get the page title', function() {
        expect(page.getLoginPageTitle).to.eventually.equal('Test');
    });
});

login.po.js

'use strict';

var LoginPage = function(){
    browser.get('http://localhost:3000/');
};

LoginPage.prototype = Object.create({}, {
    getLoginPageTitle: {get: function() {
        return browser.getTitle();
    }}
});

module.exports = LoginPage;