"use strict";
/**
* Page of browser.
*
* @class
* @name Page
* @arg {string} name - Name of page.
* @arg {string} pageUrl - URL of page.
* @arg {object} elements - Element names and selectors dictionary.
*/
var _ = require("lodash");
var Element = require("./element");
var Page = function (name, pageUrl, elements) {
this.name = name;
this.url = pageUrl;
this._webdriver = null;
this.addElements(elements || {});
};
/**
* Sets webdriver for page.
*
* @method
* @arg {object} webdriver - Webdriver instance.
*/
Page.prototype.setDriver = function (webdriver) {
this._webdriver = webdriver;
};
/**
* Gets webdriver.
*
* @method
* @return {object} - Webdriver instance.
* @throws {AssertionError} - If webdriver isn't set yet.
*/
Page.prototype.getDriver = function () {
expect(this._webdriver,
"Webdriver isn't set")
.to.exist;
return this._webdriver;
};
/**
* Adds elements to page.
*
* @method
* @arg {object} elements - Element names and selectors dictionary.
*/
Page.prototype.addElements = function (elements) {
for (var name in elements) {
var selector = elements[name];
this._addElement(name, selector);
};
};
/**
* Adds element.
*
* @protected
* @method
* @arg {string} name - Element name.
* @arg {string} selector - Element selector.
*/
Page.prototype._addElement = function (name, selector) {
if (_.isFunction(selector)) {
this._addElement(name, selector());
} else if (_.isArray(selector)) {
if (selector.length < 1) {
throw new Error("selectors array should have at least 1 item");
};
for (var i = 0; i < selector.length; i++) {
var n = name + "_" + (i + 1);
var s = selector[i];
this._addElement(n, s);
};
} else if (_.isString(selector)) {
if (this[name]) {
throw new Error(
`Page '${this.name}' already contains property '${name}'`);
};
this[name] = new Element(name, selector, this);
} else {
throw new Error("selector should be string or array or function " +
`but not ${typeof selector}`);
};
};
/**
* Removes elements from page.
*
* @method
* @arg {...string} elementNames - Sequence of element names.
*/
Page.prototype.removeElements = function () {
for (var name of arguments) delete this[name];
};
module.exports = Page;