wp-e2e-webdriver
Version:
Webdriver manager and helper for WP end-to-end tests
386 lines (317 loc) • 13.7 kB
JavaScript
'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;