将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的文本会变为"changed"。但我必须点击正确的元素,当我有一个想要交互的分叉浏览器时,只使用元素是不对的。但我不知道如何在HomeView页面对象中设置正确的元素变量。我现在使用browser2.element从forked驱动程序中获取元素变量,但如何将其公开给所有页面对象呢。目前,我将浏览器实例的元素属性作为参数传递给页面对象,但我不知道如何进一步。

请帮帮我,这让我疯了!

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