javascript – 将browser.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的文本将更改为“已更改”.但是我必须单击右边的元素,当我有一个我想要与之交互的分叉浏览器时,使用just元素是不对的.但我不知道如何在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;
};
点赞