获取 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;
};
当我派生一个驱动程序实例以在浏览器之间发送消息时,我正在进行测试。我还使用页面对象来映射视图。在我的页面对象中,我还有其他页面对象,其中一些对象继承自另一个页面对象。但是,当我分叉一个驱动程序实例并使用两个浏览器时,从页面对象中的分叉驱动程序获取 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;
};