Skip to content

Commit c85be39

Browse files
committed
feat(max_versions): set max versions based on string matching
- Do a version match based on string startsWith of the maxVersion An example: Matching "0.1" might find versions 0.14.0, 0.151.0, 0.1.0. It will then get the max version which is 0.151. If a user wanted to get 0.1, then they could specify version "0.1." - Fix / update interchangable aliases: - selenium == standalone - chromedriver == chrome - geckodriver == gecko - iedriver = ie Tagging angular#280, angular#358, angular#353. Additional work is still required to have a config file that has this information instead of hard coding it.
1 parent 289d183 commit c85be39

File tree

10 files changed

+246
-103
lines changed

10 files changed

+246
-103
lines changed

lib/cli/index.ts

Lines changed: 98 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import * as start from '../cmds/start';
55
import * as status from '../cmds/status';
66
import * as update from '../cmds/update';
77

8-
const CHROME = 'chrome';
9-
const chromeOption: yargs.Options = {
8+
const CHROMEDRIVER_ALIAS = 'chrome';
9+
const CHROMEDRIVER = 'chromedriver';
10+
const chromedriverOption: yargs.Options = {
1011
describe: 'Install or update chromedriver.',
1112
default: true,
1213
type: 'boolean'
1314
};
14-
const CHROME_LOGS = 'chrome_logs';
15-
const chromeLogsOption: yargs.Options = {
15+
const CHROMEDRIVER_LOGS_ALIAS = 'chrome_logs';
16+
const CHROMEDRIVER_LOGS = 'chromedriver_logs';
17+
const chromedriverLogsOption: yargs.Options = {
1618
describe: 'File path to chrome logs.',
1719
type: 'string'
1820
};
@@ -30,8 +32,9 @@ const edgeOption: yargs.Options = {
3032
'"C:\Program Files (x86)\Microsoft Web Driver\MirosoftWebDriver.exe"',
3133
type: 'string'
3234
};
33-
const GECKO = 'gecko';
34-
const geckoOption: yargs.Options = {
35+
const GECKODRIVER_ALIAS = 'gecko';
36+
const GECKODRIVER = 'geckodriver';
37+
const geckodriverOption: yargs.Options = {
3538
describe: 'Install or update geckodriver.',
3639
default: true,
3740
type: 'boolean'
@@ -41,8 +44,9 @@ const githubTokenOption: yargs.Options = {
4144
describe: 'Use a GitHub token to prevent rate limit issues.',
4245
type: 'string'
4346
};
47+
const IEDRIVER_ALIAS = 'ie';
4448
const IEDRIVER = 'iedriver';
45-
const ieOption: yargs.Options = {
49+
const iedriverOption: yargs.Options = {
4650
describe: 'Install or update ie driver.',
4751
default: false,
4852
type: 'boolean'
@@ -58,6 +62,31 @@ const logLevelOption: yargs.Options = {
5862
default: 'info',
5963
type: 'string'
6064
};
65+
const MAX_VERSIONS_CHROMEDRIVER_ALIAS = 'max_versions.chrome';
66+
const MAX_VERSIONS_CHROMEDRIVER = 'max_versions.chromedriver';
67+
const maxVersionsChromedriverOption: yargs.Options = {
68+
describe: 'The chromedriver max version used only for update.',
69+
type: 'string'
70+
};
71+
const MAX_VERSIONS_GECKODRIVER_ALIAS = 'max_versions.gecko';
72+
const MAX_VERSIONS_GECKODRIVER = 'max_versions.geckodriver';
73+
const maxVersionsGeckodriverOption: yargs.Options = {
74+
describe: 'The geckodriver max version used only for update.',
75+
type: 'string'
76+
};
77+
const MAX_VERSIONS_IEDRIVER_ALIAS = 'max_versions.ie';
78+
const MAX_VERSIONS_IEDRIVER = 'max_versions.iedriver';
79+
const maxVersionsIedriverOption: yargs.Options = {
80+
describe: 'The ie driver max version used only for update.',
81+
type: 'string'
82+
};
83+
const MAX_VERSIONS_SELENIUM_ALIAS = 'max_versions.standalone';
84+
const MAX_VERSIONS_SELENIUM = 'max_versions.selenium';
85+
const maxVersionsSeleniumOption: yargs.Options = {
86+
describe: 'The selenium server standalone max version used only for update.',
87+
type: 'string'
88+
};
89+
6190
const OUT_DIR = 'out_dir';
6291
const outDirOption: yargs.Options = {
6392
describe: 'Location of output.',
@@ -68,34 +97,40 @@ const proxyOption: yargs.Options = {
6897
describe: 'Use a proxy server to download files.',
6998
type: 'string'
7099
};
71-
const STANDALONE = 'standalone';
72-
const standaloneOption: yargs.Options = {
100+
const SELENIUM_ALIAS = 'standalone';
101+
const SELENIUM = 'selenium';
102+
const seleniumOption: yargs.Options = {
73103
describe: 'Install or update selenium server standalone.',
74104
default: true,
75105
type: 'boolean'
76106
};
77-
const STANDALONE_NODE = 'standalone_node';
78-
const standaloneNodeOption: yargs.Options = {
107+
const SELENIUM_NODE_ALIAS = 'standalone_node';
108+
const SELENIUM_NODE = 'selenium_node';
109+
const seleniumNodeOption: yargs.Options = {
79110
describe: 'Start the selenium server standalone with role set to "node".',
80111
type: 'boolean'
81112
};
82-
const VERSIONS_CHROME = 'versions.chrome';
83-
const versionsChromeOption: yargs.Options = {
113+
const VERSIONS_CHROMEDRIVER_ALIAS = 'versions.chrome';
114+
const VERSIONS_CHROMEDRIVER = 'versions.chromedriver';
115+
const versionsChromedriverOption: yargs.Options = {
84116
describe: 'The chromedriver version.',
85117
type: 'string'
86118
};
87-
const VERSIONS_GECKO = 'versions.gecko';
88-
const versionsGeckoOption: yargs.Options = {
119+
const VERSIONS_GECKODRIVER_ALIAS = 'versions.gecko';
120+
const VERSIONS_GECKODRIVER = 'versions.geckodriver';
121+
const versionsGeckodriverOption: yargs.Options = {
89122
describe: 'The geckodriver version.',
90123
type: 'string'
91124
};
92-
const VERSIONS_IE = 'versions.ie';
93-
const versionsIeOption: yargs.Options = {
125+
const VERSIONS_IEDRIVER_ALIAS = 'versions.ie';
126+
const VERSIONS_IEDRIVER = 'versions.iedriver';
127+
const versionsIedriverOption: yargs.Options = {
94128
describe: 'The ie driver version.',
95129
type: 'string'
96130
};
97-
const VERSIONS_STANDALONE = 'versions.standalone';
98-
const versionsStandaloneOption: yargs.Options = {
131+
const VERSIONS_SELENIUM_ALIAS = 'versions.standalone';
132+
const VERSIONS_SELENIUM = 'versions.selenium';
133+
const versionsSeleniumOption: yargs.Options = {
99134
describe: 'The selenium server standalone version.',
100135
type: 'string'
101136
};
@@ -122,20 +157,31 @@ yargs
122157
.command(
123158
'start', 'Start up the selenium server.',
124159
(yargs: yargs.Argv) => {
125-
return yargs.option(CHROME, chromeOption)
126-
.option(CHROME_LOGS, chromeLogsOption)
160+
return yargs
161+
.option(CHROMEDRIVER, chromedriverOption)
162+
.alias(CHROMEDRIVER_ALIAS, CHROMEDRIVER)
163+
.option(CHROMEDRIVER_LOGS, chromedriverLogsOption)
164+
.alias(CHROMEDRIVER_LOGS_ALIAS, CHROMEDRIVER_LOGS)
127165
.option(DETACH, detachOption)
128166
.option(EDGE, edgeOption)
129-
.option(GECKO, geckoOption)
130-
.option(IEDRIVER, ieOption)
167+
.option(GECKODRIVER, geckodriverOption)
168+
.alias(GECKODRIVER_ALIAS, GECKODRIVER)
169+
.option(IEDRIVER, iedriverOption)
170+
.alias(IEDRIVER_ALIAS, IEDRIVER)
131171
.option(LOG_LEVEL, logLevelOption)
132172
.option(OUT_DIR, outDirOption)
133-
.option(STANDALONE, standaloneOption)
134-
.option(STANDALONE_NODE, standaloneNodeOption)
135-
.option(VERSIONS_CHROME, versionsChromeOption)
136-
.option(VERSIONS_GECKO, versionsGeckoOption)
137-
.option(VERSIONS_IE, versionsIeOption)
138-
.option(VERSIONS_STANDALONE, versionsStandaloneOption);
173+
.option(SELENIUM, seleniumOption)
174+
.alias(SELENIUM_ALIAS, SELENIUM)
175+
.option(SELENIUM_NODE, seleniumNodeOption)
176+
.alias(SELENIUM_NODE_ALIAS, SELENIUM_NODE)
177+
.option(VERSIONS_CHROMEDRIVER, versionsChromedriverOption)
178+
.alias(VERSIONS_CHROMEDRIVER_ALIAS, VERSIONS_CHROMEDRIVER)
179+
.option(VERSIONS_GECKODRIVER, versionsGeckodriverOption)
180+
.alias(VERSIONS_GECKODRIVER_ALIAS, VERSIONS_GECKODRIVER)
181+
.option(VERSIONS_IEDRIVER, versionsIedriverOption)
182+
.alias(VERSIONS_IEDRIVER_ALIAS, VERSIONS_IEDRIVER)
183+
.option(VERSIONS_SELENIUM, versionsSeleniumOption)
184+
.alias(VERSIONS_SELENIUM_ALIAS, VERSIONS_SELENIUM);
139185
},
140186
(argv: yargs.Arguments) => {
141187
start.handler(argv);
@@ -153,19 +199,34 @@ yargs
153199
'update', 'Install or update selected binaries.',
154200
(yargs: yargs.Argv) => {
155201
return yargs.option(OUT_DIR, outDirOption)
156-
.option(CHROME, chromeOption)
157-
.option(GECKO, geckoOption)
202+
.option(CHROMEDRIVER, chromedriverOption)
203+
.alias(CHROMEDRIVER_ALIAS, CHROMEDRIVER)
204+
.option(GECKODRIVER, geckodriverOption)
205+
.alias(GECKODRIVER_ALIAS, GECKODRIVER)
158206
.option(GITHUB_TOKEN, githubTokenOption)
159-
.option(IEDRIVER, ieOption)
207+
.option(IEDRIVER, iedriverOption)
208+
.alias(IEDRIVER_ALIAS, IEDRIVER)
160209
.option(IGNORE_SSL, ignoreSSLOption)
161210
.option(LOG_LEVEL, logLevelOption)
211+
.option(MAX_VERSIONS_CHROMEDRIVER, maxVersionsChromedriverOption)
212+
.alias(MAX_VERSIONS_CHROMEDRIVER_ALIAS, MAX_VERSIONS_CHROMEDRIVER)
213+
.option(MAX_VERSIONS_GECKODRIVER, maxVersionsGeckodriverOption)
214+
.alias(MAX_VERSIONS_GECKODRIVER_ALIAS, MAX_VERSIONS_GECKODRIVER)
215+
.option(MAX_VERSIONS_IEDRIVER, maxVersionsIedriverOption)
216+
.alias(MAX_VERSIONS_IEDRIVER_ALIAS, MAX_VERSIONS_IEDRIVER)
217+
.option(MAX_VERSIONS_SELENIUM, maxVersionsSeleniumOption)
162218
.option(OUT_DIR, outDirOption)
163219
.option(PROXY, proxyOption)
164-
.option(STANDALONE, standaloneOption)
165-
.option(VERSIONS_CHROME, versionsChromeOption)
166-
.option(VERSIONS_GECKO, versionsGeckoOption)
167-
.option(VERSIONS_IE, versionsIeOption)
168-
.option(VERSIONS_STANDALONE, versionsStandaloneOption);
220+
.option(SELENIUM, seleniumOption)
221+
.alias(SELENIUM_ALIAS, SELENIUM)
222+
.option(VERSIONS_CHROMEDRIVER, versionsChromedriverOption)
223+
.alias(VERSIONS_CHROMEDRIVER_ALIAS, VERSIONS_CHROMEDRIVER)
224+
.option(VERSIONS_GECKODRIVER, versionsGeckodriverOption)
225+
.alias(VERSIONS_GECKODRIVER_ALIAS, VERSIONS_GECKODRIVER)
226+
.option(VERSIONS_IEDRIVER, versionsIedriverOption)
227+
.alias(VERSIONS_IEDRIVER_ALIAS, VERSIONS_IEDRIVER)
228+
.option(VERSIONS_SELENIUM, versionsSeleniumOption)
229+
.alias(VERSIONS_SELENIUM_ALIAS, VERSIONS_SELENIUM);
169230
},
170231
(argv: yargs.Arguments) => {
171232
update.handler(argv);

lib/cmds/options.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@ export interface Options {
1616
githubToken?: string;
1717
}
1818

19+
export type BrowserDriverName = 'chromedriver'|'geckodriver'|'iedriver';
20+
1921
/**
2022
* Contains information about a browser driver.
2123
*/
2224
export interface BrowserDriver {
2325
// The name of the browser driver.
24-
name?: 'chromedriver'|'geckodriver'|'iedriver';
26+
name?: BrowserDriverName;
2527
// The version which does not have to follow semver.
2628
version?: string;
29+
// A max version that either fully or partially matches the version.
30+
maxVersion?: string;
2731
}
2832

2933
/**
@@ -35,6 +39,8 @@ export interface Server {
3539
name?: 'selenium';
3640
// The version which does not have to follow semver.
3741
version?: string;
42+
// A max version that either fully or partially matches the version.
43+
maxVersion?: string;
3844
// Run as role = node option.
3945
runAsNode?: boolean;
4046
// The relative or full path to the chrome logs file.

lib/cmds/update.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const log = loglevel.getLogger('webdriver-manager');
1111
* @param argv The argv from yargs.
1212
*/
1313
export async function handler(argv: yargs.Arguments) {
14-
log.setLevel(argv.log_level);
14+
log.setLevel(argv['log_level']);
1515
const options = convertArgs2Options(argv);
1616
await update(options);
1717
}
@@ -35,12 +35,14 @@ export function updateBinary(optionsBinary: OptionsBinary): Promise<void[]> {
3535
const promises = [];
3636
if (optionsBinary.browserDrivers) {
3737
for (const provider of optionsBinary.browserDrivers) {
38-
promises.push(provider.binary.updateBinary(provider.version));
38+
promises.push(provider.binary.updateBinary(provider.version,
39+
provider.maxVersion));
3940
}
4041
}
4142
if (optionsBinary.server && optionsBinary.server.binary) {
4243
promises.push(
43-
optionsBinary.server.binary.updateBinary(optionsBinary.server.version));
44+
optionsBinary.server.binary.updateBinary(optionsBinary.server.version,
45+
optionsBinary.server.maxVersion));
4446
}
4547
return Promise.all(promises);
4648
}

lib/cmds/utils.ts

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {IEDriver} from '../provider/iedriver';
55
import {ProviderConfig} from '../provider/provider';
66
import {SeleniumServer, SeleniumServerProviderConfig} from '../provider/selenium_server';
77

8-
import {Options} from './options';
8+
import {BrowserDriver, BrowserDriverName, Options} from './options';
99
import {OptionsBinary} from './options_binary';
1010

1111
/**
@@ -48,41 +48,25 @@ export function addOptionsBinary(options: Options): OptionsBinary {
4848
}
4949

5050
/**
51-
* Create the options with all providers. Used for clean and status commands.
51+
* For the clean and status commands ONLY.
52+
* Create the options with all providers.
5253
* @param argv
5354
*/
5455
export function convertArgs2AllOptions(argv: yargs.Arguments): Options {
55-
let versionsChrome, versionsGecko, versionsIe, versionsStandalone = undefined;
56-
if (argv.versions) {
57-
versionsChrome = argv.versions.chrome as string;
58-
versionsGecko = argv.versions.gecko as string;
59-
versionsIe = argv.versions.ie as string;
60-
versionsStandalone = argv.versions.standalone as string;
61-
}
6256
return {
6357
browserDrivers: [
64-
{name: 'chromedriver', version: versionsChrome},
65-
{name: 'geckodriver', version: versionsGecko},
66-
{name: 'iedriver', version: versionsIe}
58+
{name: 'chromedriver'},
59+
{name: 'geckodriver'},
60+
{name: 'iedriver'}
6761
],
68-
server: {
69-
name: 'selenium',
70-
version: versionsStandalone,
71-
runAsNode: argv.standalone_node as boolean,
72-
runAsDetach: argv.detach as boolean,
73-
chromeLogs: argv.chrome_logs as string,
74-
edge: argv.edge as string,
75-
},
76-
ignoreSSL: argv.ignore_ssl as boolean,
77-
outDir: argv.out_dir as string,
78-
proxy: argv.proxy as string,
79-
githubToken: argv.github_token as string,
62+
server: {name: 'selenium'},
63+
outDir: argv['out_dir'] as string
8064
};
8165
}
8266

8367
/**
84-
* Create the options with providers depending on argv's. Used for update and
85-
* start commands.
68+
* For the update and start commands ONLY.
69+
* Create the options with providers depending on argv's.
8670
* @param argv
8771
*/
8872
export function convertArgs2Options(argv: yargs.Arguments): Options {
@@ -95,31 +79,36 @@ export function convertArgs2Options(argv: yargs.Arguments): Options {
9579
githubToken: argv.github_token as string,
9680
};
9781

98-
let versionsChrome, versionsGecko, versionsIe, versionsStandalone = undefined;
99-
if (argv.versions) {
100-
versionsChrome = argv.versions.chrome as string;
101-
versionsGecko = argv.versions.gecko as string;
102-
versionsIe = argv.versions.ie as string;
103-
versionsStandalone = argv.versions.standalone as string;
104-
}
105-
if (argv.chrome as boolean) {
106-
options.browserDrivers.push(
107-
{name: 'chromedriver', version: versionsChrome});
82+
if (argv['chromedriver'] as boolean) {
83+
setVersions('chromedriver', argv, options.browserDrivers);
10884
}
109-
if (argv.gecko as boolean) {
110-
options.browserDrivers.push({name: 'geckodriver', version: versionsGecko});
85+
if (argv['geckodriver'] as boolean) {
86+
setVersions('geckodriver', argv, options.browserDrivers);
11187
}
112-
if (argv.iedriver as boolean) {
113-
options.browserDrivers.push({name: 'iedriver', version: versionsIe});
88+
if (argv['iedriver'] as boolean) {
89+
setVersions('iedriver', argv, options.browserDrivers);
11490
}
115-
if (argv.standalone as boolean) {
91+
if (argv['selenium']) {
11692
options.server = {};
11793
options.server.name = 'selenium';
11894
options.server.runAsNode = argv.standalone_node as boolean;
11995
options.server.runAsDetach = argv.detach as boolean;
120-
options.server.version = versionsStandalone;
96+
options.server.version = argv['versions'] && argv['versions']['selenium'] ?
97+
argv['versions']['selenium'] as string : undefined;
98+
options.server.maxVersion = argv['max_versions']
99+
&& argv['max_versions']['selenium'] ?
100+
argv['versions']['selenium'] as string : undefined;
121101
options.server.chromeLogs = argv.chrome_logs as string;
122102
options.server.edge = argv.edge as string;
123103
}
124104
return options;
105+
}
106+
107+
function setVersions(name: BrowserDriverName,
108+
argv: yargs.Arguments, browserDrivers: BrowserDriver[]) {
109+
const version = argv['versions'] && argv['versions'][name] ?
110+
argv['versions'][name] as string : undefined;
111+
const maxVersion = argv['max_versions'] && argv['max_versions'][name] ?
112+
argv['max_versions'][name] as string : undefined;
113+
browserDrivers.push({name, version, maxVersion});
125114
}

0 commit comments

Comments
 (0)