UNPKG

wp-e2e-webdriver

Version:

Webdriver manager and helper for WP end-to-end tests

386 lines (317 loc) 13.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /** * WebDriver helper. * * @module WebDriverManager */ /** * External dependencies */ // eslint-disable-line no-unused-vars var _urlJoin = require('url-join'); var _urlJoin2 = _interopRequireDefault(_urlJoin); var _seleniumWebdriver = require('selenium-webdriver'); var _seleniumWebdriver2 = _interopRequireDefault(_seleniumWebdriver); var _chromedriver = require('chromedriver'); var _chromedriver2 = _interopRequireDefault(_chromedriver); var _proxy = require('selenium-webdriver/proxy'); var _proxy2 = _interopRequireDefault(_proxy); var _firefox = require('selenium-webdriver/firefox'); var _firefox2 = _interopRequireDefault(_firefox); var _chrome = require('selenium-webdriver/chrome'); var _chrome2 = _interopRequireDefault(_chrome); var _saucelabs = require('saucelabs'); var _saucelabs2 = _interopRequireDefault(_saucelabs); var _path = require('path'); var _path2 = _interopRequireDefault(_path); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var implicitWait = 2000; var pageLoadWaitMs = 60000; var chromeUA = 'Mozilla/5.0 (wp-e2e-tests) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'; var firefoxUA = 'Mozilla/5.0 (wp-e2e-tests) Gecko/20100101 Firefox/46.0'; var saucePreRunScriptURL = 'https://raw.githubusercontent.com/Automattic/wp-e2e-tests/master/fix-saucelabs-etc-hosts.sh'; var saucePreRunWinScriptURL = 'https://raw.githubusercontent.com/Automattic/wp-e2e-tests/master/fix-saucelabs-etc-hosts.bat'; var defaultArgs = { baseUrl: 'https://automattic.com', resizeBrowserWindow: true, useCustomUA: true, proxy: 'direct', screenshotsDir: _path2.default.resolve(process.cwd(), 'screenshots'), headless: false }; /** * Class representing WebDriver manager. */ var Manager = function () { /** * Creates a manager. * * @param {string} browser - Browser to use. Valid value includes `chrome` * and 'firefox'. * @param {object} config - Manager configuration. */ function Manager() { var browser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'chrome'; var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Manager); this.browser = browser; this.config = Object.assign(defaultArgs, config); this.setupDriver(); } /** * Returns instance of WebDriver. * * @example * * import { WebDriverManager } from 'wp-e2e-webdriver'; * * const manager = new WebDriverManager( 'chrome' ); * const driver = manager.getDriver(); * * @return {object} Instance of WebDriver. */ _createClass(Manager, [{ key: 'getDriver', value: function getDriver() { return this.driver; } }, { key: 'setupDriver', value: function setupDriver() { if (this.config.useSauce) { this.driver = this.buildSauceDriver(); } else { var browserName = this.browser.toLowerCase(); switch (browserName) { case 'chrome': this.driver = this.buildChromeDriver(); break; case 'firefox': this.driver = this.buildFirefoxDriver(); break; default: throw new Error('The specified browser: \'' + browserName + '\' in the config' + 'is not supported. Supported browsers are "chrome" and "firefox"'); } this.browserName = browserName; } this.driver.manage().timeouts().implicitlyWait(implicitWait); this.driver.manage().timeouts().pageLoadTimeout(pageLoadWaitMs); if (this.config.resizeBrowserWindow) { this.resizeBrowser(this.getConfigScreenSize()); } } }, { key: 'buildSauceDriver', value: function buildSauceDriver() { var caps = this.config.sauceConfig; caps.username = this.config.sauceCreds.sauceUsername; caps.accessKey = this.config.sauceCreds.sauceAccessKey; caps.name = caps.browserName + ' - [' + this.getConfigScreenSize() + ']'; caps.maxDuration = 2700; // 45 minutes var preRunScript = saucePreRunScriptURL; if (caps.platform.match(/Windows/)) { preRunScript = saucePreRunWinScriptURL; } caps.prerun = { executable: preRunScript }; if (process.env.CIRCLE_BUILD_NUM) { caps.name += ' - CircleCI Build #' + process.env.CIRCLE_BUILD_NUM; } global._sauceLabs = new _saucelabs2.default({ username: caps.username, password: caps.accessKey }); var builder = new _seleniumWebdriver2.default.Builder(); this.browserName = caps.browserName; var driver = builder.usingServer('http://ondemand.saucelabs.com:80/wd/hub').withCapabilities(caps).build(); driver.getSession().then(function (sessionid) { driver.allPassed = true; driver.sessionID = sessionid.id_; }); this.driver = driver; return this.driver; } }, { key: 'buildChromeDriver', value: function buildChromeDriver() { var builder = new _seleniumWebdriver2.default.Builder(); builder.setChromeOptions(this.createChromeOptions()); return builder.forBrowser('chrome').setLoggingPrefs(this.createLoggingPreference()).build(); } }, { key: 'createChromeOptions', value: function createChromeOptions() { var options = new _chrome2.default.Options(); options.setProxy(this.getProxyType()); options.addArguments('--no-sandbox'); if (process.env.HEADLESS || this.config.headless) { options.addArguments('--headless'); } if (this.config.useCustomUA) { options.addArguments('user-agent=' + chromeUA); } if (this.config.allowRunningInsecureContent) { options.addArguments('--allow-running-insecure-content'); } return options; } }, { key: 'buildFirefoxDriver', value: function buildFirefoxDriver() { var builder = new _seleniumWebdriver2.default.Builder(); builder.setFirefoxOptions(this.createFirefoxOptions()); return builder.forBrowser('firefox').setLoggingPrefs(this.createLoggingPreference()).build(); } }, { key: 'createFirefoxProfile', value: function createFirefoxProfile() { var profile = new _firefox2.default.Profile(); profile.setNativeEventsEnabled(true); profile.setPreference('browser.startup.homepage_override.mstone', 'ignore'); profile.setPreference('browser.startup.homepage', 'about:blank'); profile.setPreference('startup.homepage_welcome_url.additional', 'about:blank'); if (this.config.useCustomUA) { profile.setPreference('general.useragent.override', firefoxUA); } return profile; } }, { key: 'createFirefoxOptions', value: function createFirefoxOptions() { var options = new _firefox2.default.Options().setProfile(this.createFirefoxProfile()); options.setProxy(this.getProxyType()); return options; } }, { key: 'createLoggingPreference', value: function createLoggingPreference() { var pref = new _seleniumWebdriver2.default.logging.Preferences(); pref.setLevel('browser', _seleniumWebdriver2.default.logging.Level.SEVERE); return pref; } /** * Get screen size from manager's configuration. * * @return {string} Screen size like 'desktop' or 'mobile'. */ }, { key: 'getConfigScreenSize', value: function getConfigScreenSize() { var screenSize = this.config.screenSize || process.env.BROWSERSIZE; if (screenSize === undefined || screenSize === '') { screenSize = 'desktop'; } return screenSize.toLowerCase(); } /** * Get object representation of `screenSize`. * * @param {string} screenSize - Screen size like 'desktop' or 'mobile'. * * @return {object} Object representation of screen size. */ }, { key: 'getScreenSizeAsObject', value: function getScreenSizeAsObject(screenSize) { switch (screenSize) { case 'mobile': return { width: 500, height: 1000 }; case 'tablet': return { width: 1024, height: 1000 }; case 'desktop': return { width: 1440, height: 1000 }; case 'laptop': return { width: 1400, height: 790 }; default: throw new Error('Unsupported screen size specified (' + screenSize + '). ' + 'Supported values are desktop, tablet and mobile.'); } } /** * Resize the browser to `screenSize`. * * @param {string} screenSize - Screen size like 'desktop' or 'mobile'. */ }, { key: 'resizeBrowser', value: function resizeBrowser(screenSize) { if (typeof screenSize === 'string') { switch (screenSize.toLowerCase()) { case 'mobile': this.driver.manage().window().setSize(500, 1000); break; case 'tablet': this.driver.manage().window().setSize(1024, 1000); break; case 'desktop': this.driver.manage().window().setSize(1440, 1000); break; case 'laptop': this.driver.manage().window().setSize(1400, 790); break; default: throw new Error('Unsupported screen size specified (' + screenSize + '). ' + 'Supported values are desktop, tablet and mobile.'); } } else { throw new Error('Unsupported screen size specified (' + screenSize + '). ' + 'Supported values are desktop, tablet and mobile.'); } } /** * Quit currently running browser. * * @param {number} waitForMs - Wait time in millisecond before quit. * * @return {Promise} A promise that will be resolved once browser quitted. */ }, { key: 'quitBrowser', value: function quitBrowser() { var waitForMs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var driver = this.driver; return driver.sleep(waitForMs).then(function () { return driver.quit(); }); } }, { key: 'getProxyType', value: function getProxyType() { var proxyType = this.config.proxy; switch (proxyType.toLowerCase()) { case 'direct': return _proxy2.default.direct(); case 'system': return _proxy2.default.system(); default: throw new Error('Unknown proxy type specified of: \'' + proxyType + '\'. Supported' + 'values are "direct" or "system"'); } } /** * Get base URL from manager's configuration. * * @return {string} Base URL from manager's configuration. */ }, { key: 'getBaseUrl', value: function getBaseUrl() { return this.config.baseUrl; } /** * Get page url given a `pagePath` without the hostname. * * @param {string} pagePath - Page path. * * @return {string} Full URL. Joined base URL with `pagePath`. */ }, { key: 'getPageUrl', value: function getPageUrl() { var pagePath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '/'; return (0, _urlJoin2.default)(this.getBaseUrl(), pagePath); } }]); return Manager; }(); exports.default = Manager; module.exports = exports.default;