#!/usr/bin/env node var debug = require('debug')('selenium-standalone:cli'); var minimist = require('minimist'); var which = require('which'); var merge = require('lodash').merge; var path = require('path'); var selenium = require('../'); var defaultConfig = require('../lib/default-config'); function parseCommandAndOptions(javaPath) { var argv = minimist(process.argv.slice(2), { string: ['version', 'drivers.chrome.version', 'drivers.ie.version', 'drivers.firefox.version', 'drivers.edge.version'] }); var action = argv._[0]; if (!action) { throw new Error('No action provided'); } if (action !== 'install' && action !== 'start') { throw new Error('Invalid action "'+ action + ' (Valid actions are [' + Object.keys(actions).join(', ') + '])'); } // everything after `selenium-standalone install [options] --` will be in argv._ var seleniumArgs = argv._.slice(1); // build a new map removing `_` and --config from argv var options = Object.keys(argv).reduce(function(prev, cur) { if ((cur !== '_') && (cur !== 'config')) { prev[cur] = argv[cur]; } return prev; }, {}); // If a config file was specified, load it var configFromFile = {}; if (argv.config) { try { configFromFile = require(path.resolve(process.cwd(), argv.config)); if (typeof configFromFile !== 'object') { throw new Error('Config file does not exports an object'); } } catch(err) { throw new Error('Error parsing config file : ' + (err.message || err)); } } // Merge default options, options from config file then command line options options = merge({}, defaultConfig, configFromFile, options); if (seleniumArgs.length) { options.seleniumArgs = seleniumArgs; } else if (!Array.isArray(options.seleniumArgs)) { options.seleniumArgs = []; } options.spawnOptions = { stdio: 'inherit' }; options.logger = options.silent ? null : console.log; options.javaPath = javaPath; return [action, options]; } var actions = { start: function(options) { var killEvents = ['exit', 'SIGTERM', 'SIGINT']; selenium.start(options, started); function started(err, cp) { if (err) { throw err; } console.log('Selenium started'); killEvents.forEach(register); function register(evName) { process.on(evName, kill); } function unregister(evName) { process.removeListener(evName, kill); } function kill() { killEvents.forEach(unregister); cp.kill('SIGTERM'); } } }, install: function(options) { var ProgressBar = require('progress'); var bar; var firstProgress = true; options.progressCb = options.silent ? null : progressCb; selenium.install(options, installed); function installed(err) { if (err) { throw err; } } function progressCb(total, progress, chunk) { if (firstProgress) { console.log(''); console.log(''); firstProgress = false; } bar = bar || new ProgressBar( 'selenium-standalone installation [:bar] :percent :etas', { total: total, complete: '=', incomplete: ' ', width: 20 }); bar.tick(chunk); } } }; // Export the command line parsing function for tests. module.exports = parseCommandAndOptions; if (!process.env || !process.env.NODE_ENV || (process.env.NODE_ENV !== 'test-cli-parameters')) { which('java', function javaFound(err, javaPath) { debug('Started via CLI with: ', process.argv); var params; try { if (err) { throw err; } params = parseCommandAndOptions(javaPath); } catch (err) { process.stderr.write((err.message || err) + "\n"); process.stderr.write("Usage: selenium-standalone action [options]\n"); process.exit(255); } actions[params[0]](params[1]); }); }