将browser.element获取到包含子项的页面对象中

时间:2015-04-23 16:12:57

标签: javascript prototype protractor

当我分叉驱动程序实例以在浏览器之间发送消息时,我正在进行测试。我还使用页面对象来映射视图。在我的页面对象中,我有其他页面对象,其中一些是从另一个页面对象继承的。但是,当我分叉驱动程序实例并使用两个浏览器时,从页面对象中的分叉驱动程序获取元素功能很麻烦。特别是对于其他PO继承自的页面对象。这是我的代码中的一个示例:

var NavBar = function () {  
    this.button = element(by.buttonText('Click'));
};

var MySiteElement = function () {
    this.someElement = element(by.name('hiddenElement'));
};

NavBar.prototype = new MySiteElement();

var HomeView = function (element) {
    this.navbar = new NavBar()
};

module.exports = HomeView;

让我们说我的规格如下:

describe('Home View', funciton () {
    it('should get text from right browser', function () {
        browser.get('http://localhost:3000/#/home');
        var browser2 = browser.forkNewDriverInstance(true);
        var view = new HomeView(browser.element);
        var view2 = new HomeView(browser2.element);
        view2.navbar.content.click()
        expect(view.navbar.someElement.getText()).toBe('unchanged')
        expect(view2.navbar.someElement.getText()).toBe('changed')
    });
});

我们假设我的网站是合成的,以便在点击导航栏按钮时,someElement的文字会更改为“已更改”。但是我必须单击右边的元素,当我有一个我想要与之交互的分叉浏览器时,使用just元素是不对的。但我不知道如何在HomeView页面对象中设置正确的元素变量。我现在说browser2.element从分叉驱动程序中获取了元素变量,但是如何将它暴露给所有页面对象。目前我将浏览器实例的元素属性作为参数传递给页面对象,但我不知道如何更进一步。

请帮助,这让我发疯了!

1 个答案:

答案 0 :(得分:2)

我想出了一个解决方案。由于元素函数只应该传递一次(当实例化HomeView时,因为每个其他PO都是HomeView的子节点)我只传递一次元素函数。然后,所有类的声明都嵌套在HomeView对象函数中:

var HomeView = function (element) {
    var NavBar = function () {  
        this.button = element(by.buttonText('Click'));
    };

    var MySiteElement = function () {
        this.someElement = element(by.name('hiddenElement'));
    };

    NavBar.prototype = new MySiteElement();

    this.navbar = new NavBar(element);
};

module.exports = HomeView;

但是,如果您有多个View对象,这意味着重复自己(没有好处)。我使用节点模块导入页面对象,以及模块'范围不会从他们需要的地方继承。但对此我也有一个解决方案。在页面对象所在的模块中,导出一个包含页面对象声明的函数并将该元素传递给它。

var HomeView = function (element) {
    var NavBar = require('./navBar.po.js')(element):

    this.navbar = new NavBar();
};

module.exports = HomeView

./navBar.po.js看起来像这样:

module.exports = function (element) {
    require('./mySiteElement.po.js')(element);

    var NavBar = function () {
        this.button = element(by.buttonText('Click'));
    }

    NavBar.prototype = new MySiteElement();

    return NavBar;
};