获取 browser.element 个包含子项的页面对象

Get browser.element into page objects with children

当我派生一个驱动程序实例以在浏览器之间发送消息时,我正在进行测试。我还使用页面对象来映射视图。在我的页面对象中,我还有其他页面对象,其中一些对象继承自另一个页面对象。但是,当我分叉一个驱动程序实例并使用两个浏览器时,从页面对象中的分叉驱动程序获取 element 函数很麻烦。特别是对于其他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 的文本更改为 'changed'。但是我必须点击正确的元素,当我有一个我想与之交互的分叉浏览器时,只使用元素是不对的。但我不知道如何在 HomeView 页面对象中设置正确的元素变量。我现在 browser2.element 从分叉驱动程序中获取元素变量,但我如何将其公开给所有页面对象。目前我将浏览器实例的元素 属性 作为参数传递给页面对象,但我不知道如何进一步。

请帮忙,这让我抓狂!

我想出了一个解决办法。由于元素函数只应传递一次(在实例化 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;
};