"use strict"; /** * Steps for page. * * @mixin PageSteps */ var url = require("url"); var expect = require("chai").expect; var U = require("glace-utils"); var LOG = U.logger; var PageSteps = { registerPages: function () { /** * Helper to register pages. * * @memberOf PageSteps * @method registerPages * @instance * @arg {...Page} pages - Sequence of pages. */ for (var page of arguments) { if (this._pages()[page.name]) { LOG.debug(`Page ${page.name} is registered already`); continue; }; allure.step(`Register web page ${page.name}`); LOG.info(`Register web page ${page.name}`); page.setDriver(this.webdriver); this._pages()[page.name] = page; allure.pass(); }; }, removePages: function () { /** * Helper to remove pages. * * @memberOf PageSteps * @method removePages * @instance * @arg {...string} pageNames - Sequence of page names. */ for (var pageName of arguments) { if (!this._pages()[pageName]) { LOG.debug(`Page ${pageName} isn't registered`); continue; }; allure.step(`Remove page ${pageName}`); LOG.info(`Remove page ${pageName}`); this._pages()[pageName].setDriver(null); delete this._pages()[pageName]; allure.pass(); }; }, openPage: async function (pageName) { /** * Step to open page. * * @async * @memberOf PageSteps * @method openPage * @instance * @arg {string} pageName - Name of page to open. * @return {Promise} */ allure.step(`Open web page ${pageName}`); expect(this.webUrl, "Web URL isn't defined").to.exist; LOG.info(`Openning page '${pageName}' in browser...`); var page = this._pages()[pageName]; var webUrl = url.resolve(this.webUrl, page.url); await this.openUrl(webUrl); LOG.info("Page is opened"); allure.pass(); }, getCurrentPage: async function () { /** * Step to get current page. * * @async * @memberOf PageSteps * @method getCurrentPage * @instance * @return {Promise<Page>} - Page which corresponds to current browser URL. * @throws {Error} - If no one of registered pages corresponds to * current browser URL. */ allure.step("Get current web page"); LOG.info("Getting current web page..."); /* sort pages by descending page url length */ var pages = Object.values(this._pages()).sort( (a, b) => a.url.length < b.url.length); var curUrl = await this.webdriver.getUrl(); var parsedUrl = url.parse(curUrl); for (var page of pages) { if (parsedUrl.pathname.startsWith(page.url)) { LOG.info("Current web page is found"); allure.pass(); return page; } }; throw new Error( `No one of registered pages corresponds URL '${curUrl}'`); }, getElement: async function (name, opts) { /** * Step to get UI element. * * @async * @memberOf PageSteps * @method getElement * @instance * @arg {string} name - UI element name. * @arg {object} [opts] - Step options. * @arg {boolean} [opts.check=true] - Flag to check step result. * @return {Promise<object>} - UI element. * @throws {AssertionError} - If element wasn't found. */ opts = U.defVal(opts, {}); var check = U.defVal(opts.check, true); allure.step(`Get web element with name ${name}`); LOG.info(`Getting web element with name ${name}...`); var element = (await this.getCurrentPage())[name]; if (check) { expect(element, `Undefined DOM element ${name}`).to.exist; }; LOG.info("Web element is found"); allure.pass(); return element; }, /** * Helper to initialize pages storage. * * @method * @instance * @protected */ _pages: function () { if (!this.__pages) this.__pages = {}; return this.__pages; }, }; module.exports = PageSteps;