165 lines
No EOL
7.2 KiB
JavaScript
165 lines
No EOL
7.2 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
/*
|
|
* This is an implementation of the Local Driver Provider.
|
|
* It is responsible for setting up the account object, tearing
|
|
* it down, and setting up the driver correctly.
|
|
*
|
|
* TODO - it would be nice to do this in the launcher phase,
|
|
* so that we only start the local selenium once per entire launch.
|
|
*/
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const q = require("q");
|
|
const exitCodes_1 = require("../exitCodes");
|
|
const logger_1 = require("../logger");
|
|
const driverProvider_1 = require("./driverProvider");
|
|
const SeleniumConfig = require('webdriver-manager/built/lib/config').Config;
|
|
const remote = require('selenium-webdriver/remote');
|
|
let logger = new logger_1.Logger('local');
|
|
class Local extends driverProvider_1.DriverProvider {
|
|
constructor(config) {
|
|
super(config);
|
|
this.server_ = null;
|
|
}
|
|
/**
|
|
* Helper to locate the default jar path if none is provided by the user.
|
|
* @private
|
|
*/
|
|
addDefaultBinaryLocs_() {
|
|
if (!this.config_.seleniumServerJar) {
|
|
logger.debug('Attempting to find the SeleniumServerJar in the default ' +
|
|
'location used by webdriver-manager');
|
|
try {
|
|
let updateJson = path.resolve(SeleniumConfig.getSeleniumDir(), 'update-config.json');
|
|
let updateConfig = JSON.parse(fs.readFileSync(updateJson).toString());
|
|
this.config_.seleniumServerJar = updateConfig.standalone.last;
|
|
}
|
|
catch (err) {
|
|
throw new exitCodes_1.BrowserError(logger, 'No update-config.json found.' +
|
|
' Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
}
|
|
if (!fs.existsSync(this.config_.seleniumServerJar)) {
|
|
throw new exitCodes_1.BrowserError(logger, 'No selenium server jar found at ' + this.config_.seleniumServerJar +
|
|
'. Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
if (this.config_.capabilities.browserName === 'chrome') {
|
|
if (!this.config_.chromeDriver) {
|
|
logger.debug('Attempting to find the chromedriver binary in the default ' +
|
|
'location used by webdriver-manager');
|
|
try {
|
|
let updateJson = path.resolve(SeleniumConfig.getSeleniumDir(), 'update-config.json');
|
|
let updateConfig = JSON.parse(fs.readFileSync(updateJson).toString());
|
|
this.config_.chromeDriver = updateConfig.chrome.last;
|
|
}
|
|
catch (err) {
|
|
throw new exitCodes_1.BrowserError(logger, 'No update-config.json found. ' +
|
|
'Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
}
|
|
// Check if file exists, if not try .exe or fail accordingly
|
|
if (!fs.existsSync(this.config_.chromeDriver)) {
|
|
if (fs.existsSync(this.config_.chromeDriver + '.exe')) {
|
|
this.config_.chromeDriver += '.exe';
|
|
}
|
|
else {
|
|
throw new exitCodes_1.BrowserError(logger, 'Could not find chromedriver at ' + this.config_.chromeDriver +
|
|
'. Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
}
|
|
}
|
|
if (this.config_.capabilities.browserName === 'firefox') {
|
|
if (!this.config_.geckoDriver) {
|
|
logger.debug('Attempting to find the gecko driver binary in the default ' +
|
|
'location used by webdriver-manager');
|
|
try {
|
|
let updateJson = path.resolve(SeleniumConfig.getSeleniumDir(), 'update-config.json');
|
|
let updateConfig = JSON.parse(fs.readFileSync(updateJson).toString());
|
|
this.config_.geckoDriver = updateConfig.gecko.last;
|
|
}
|
|
catch (err) {
|
|
throw new exitCodes_1.BrowserError(logger, 'No update-config.json found. ' +
|
|
'Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
}
|
|
// Check if file exists, if not try .exe or fail accordingly
|
|
if (!fs.existsSync(this.config_.geckoDriver)) {
|
|
if (fs.existsSync(this.config_.geckoDriver + '.exe')) {
|
|
this.config_.geckoDriver += '.exe';
|
|
}
|
|
else {
|
|
throw new exitCodes_1.BrowserError(logger, 'Could not find gecko driver at ' + this.config_.geckoDriver +
|
|
'. Run \'webdriver-manager update\' to download binaries.');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Configure and launch (if applicable) the object's environment.
|
|
* @public
|
|
* @return {q.promise} A promise which will resolve when the environment is
|
|
* ready to test.
|
|
*/
|
|
setupDriverEnv() {
|
|
this.addDefaultBinaryLocs_();
|
|
logger.info('Starting selenium standalone server...');
|
|
let serverConf = this.config_.localSeleniumStandaloneOpts || {};
|
|
// If args or port is not set use seleniumArgs and seleniumPort
|
|
// for backward compatibility
|
|
if (serverConf.args === undefined) {
|
|
serverConf.args = this.config_.seleniumArgs || [];
|
|
}
|
|
if (serverConf.jvmArgs === undefined) {
|
|
serverConf.jvmArgs = this.config_.jvmArgs || [];
|
|
}
|
|
else {
|
|
if (!Array.isArray(serverConf.jvmArgs)) {
|
|
throw new exitCodes_1.ConfigError(logger, 'jvmArgs should be an array.');
|
|
}
|
|
}
|
|
if (serverConf.port === undefined) {
|
|
serverConf.port = this.config_.seleniumPort;
|
|
}
|
|
// configure server
|
|
if (this.config_.chromeDriver) {
|
|
serverConf.jvmArgs.push('-Dwebdriver.chrome.driver=' + this.config_.chromeDriver);
|
|
}
|
|
if (this.config_.geckoDriver) {
|
|
serverConf.jvmArgs.push('-Dwebdriver.gecko.driver=' + this.config_.geckoDriver);
|
|
}
|
|
this.server_ = new remote.SeleniumServer(this.config_.seleniumServerJar, serverConf);
|
|
let deferred = q.defer();
|
|
// start local server, grab hosted address, and resolve promise
|
|
this.server_.start(this.config_.seleniumServerStartTimeout)
|
|
.then((url) => {
|
|
logger.info('Selenium standalone server started at ' + url);
|
|
return this.server_.address();
|
|
})
|
|
.then((address) => {
|
|
this.config_.seleniumAddress = address;
|
|
deferred.resolve();
|
|
})
|
|
.catch((err) => {
|
|
deferred.reject(err);
|
|
});
|
|
return deferred.promise;
|
|
}
|
|
/**
|
|
* Teardown and destroy the environment and do any associated cleanup.
|
|
* Shuts down the drivers and server.
|
|
*
|
|
* @public
|
|
* @override
|
|
* @return {q.promise} A promise which will resolve when the environment
|
|
* is down.
|
|
*/
|
|
teardownEnv() {
|
|
return super.teardownEnv().then(() => {
|
|
logger.info('Shutting down selenium standalone server.');
|
|
return this.server_.stop();
|
|
});
|
|
}
|
|
}
|
|
exports.Local = Local;
|
|
//# sourceMappingURL=local.js.map
|