UNPKG

@openveo/test

Version:
245 lines (213 loc) 5.79 kB
'use strict'; /** * @module e2e/pages/Page */ var url = require('url'); /** * Defines a web page to help writing end to end tests with protractor for OpenVeo. * * Do not use this directly but extend it. * * @example * var Page = require('@openveo/test').e2e.pages.Page; * * function MyPage() { * MyPage.super_.call(this); * this.path = 'be/myPage'; * } * * module.exports = MyPage; * util.inherits(MyPage, Page); * * var page = new MyPage(); * page.load().then(function() { * console.log('Page fully loaded'); * }); * * @class Page * @constructor */ function Page() { Object.defineProperties(this, /** @lends module:e2e/pages/Page~Page */ { /** * Protractor expected conditions. * * @type {Object} * @instance * @readonly */ EC: {value: protractor.ExpectedConditions}, /** * Protractor control flow. * * @type {Object} * @instance * @readonly */ flow: {value: browser.controlFlow()}, /** * Body element. * * @type {Object} * @instance * @readonly */ bodyElement: {value: element(by.css('body'))}, /** * Page element. * * Page wrapper holding the content scrollbar. * * @type {Object} * @instance * @readonly */ pageElement: {value: element(by.id('page-content-wrapper'))} } ); } module.exports = Page; /** * Loads the page. * * @example * var Page = require('@openveo/test').e2e.pages.Page; * * function MyPage() { * MyPage.super_.call(this); * this.path = 'be/myPage'; * } * * module.exports = MyPage; * util.inherits(MyPage, Page); * * var page = new MyPage(); * page.load().then(function() { * console.log('Page fully loaded'); * }); * * @return {Promise} Promise resolving when the page is fully loaded */ Page.prototype.load = function() { var self = this; var expectedUrl = process.protractorConf.baseUrl + this.path; return browser.driver.getCurrentUrl().then(function(currentUrl) { if (currentUrl.replace(/\/$/, '') !== expectedUrl.replace(/\/$/, '')) { // Current page is not the expected one // Load page return browser.get(self.path).then(function() { // Deactivate animations self.bodyElement.allowAnimations(false); return browser.driver.getCurrentUrl(); }).then(function(currentUrl) { if (currentUrl.replace(/\/$/, '') !== expectedUrl.replace(/\/$/, '')) { return protractor.promise.rejected( new Error('Failed loading page ' + expectedUrl + ' (got ' + currentUrl + ')') ); } else return self.onLoaded(); }); } else { // Current page is already the expected one // Refresh page to be sure mock modules are loaded return self.refresh(); } }); }; /** * Gets page title as described by the HTMLTitleElement. * * @example * // With MyPage extending Page * var page = new MyPage(); * assert.eventually.equal(page.getTitle(), 'My page title'); * * @return {Promise} Promise resolving with the title of the page */ Page.prototype.getTitle = function() { return browser.getTitle(); }; /** * Removes all cookies on the actual page. * * @return {Promise} Promise resolving when all cookies are deleted */ Page.prototype.deleteCookies = function() { return browser.driver.manage().deleteAllCookies(); }; /** * Sends an http request and return its reponse. * * This will execute the request from the page. * * @param {String} path Request's path * @param {String} method HTTP method to use * @param {Object} data Request's data to send in body * @return {Promise} Promise resolving with the request's response */ Page.prototype.sendRequest = function(path, method, data, multipart) { var url = process.protractorConf.baseUrl + path; return browser.executeAsyncScript(function() { var callback = arguments[arguments.length - 1]; var request = { url: arguments[0], method: arguments[1], responseType: 'json' }; if (arguments[3]) { request.data = new FormData(); for (var part in arguments[2]) { request.data.append(part, JSON.stringify(arguments[2][part])); } request.transformRequest = angular.identity; request.headers = {'Content-Type': undefined}; } else { request.data = arguments[2]; } var $http = angular.injector(['ng']).get('$http'); $http(request).then(function(response) { callback(response); }, function(response) { callback(response); }); }, url, method, data, multipart); }; /** * Refreshes actual page. * * @return {Promise} Promise resolving when the page is fully loaded */ Page.prototype.refresh = function() { var self = this; return browser.refresh().then(function() { self.bodyElement.allowAnimations(false); return self.onLoaded(); }).then(function() { return protractor.promise.fulfilled(); }); }; /** * Handles page loaded. * * Use this method to perform actions after the page is loaded. Typically, verify that the page is loaded by * waiting for elements to be present on the page. * * By default it does nothing, override it to define your own behaviour. * * @return {Promise} Promise resolving when the page is fully loaded */ Page.prototype.onLoaded = function() {}; /** * Helper Url * Get only current url path without host * * @return {Promise} Promise resolving with current path */ Page.prototype.getPath = function() { return browser.getCurrentUrl().then(function(urlToParse) { var pageUrl = new url.URL(urlToParse); return protractor.promise.fulfilled(pageUrl.pathname); }); };