@wdio/utils 8.15.7 → 8.15.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import { type GeckodriverParameters } from 'geckodriver';
5
5
  import { type EdgedriverParameters } from 'edgedriver';
6
6
  import type { InstallOptions } from '@puppeteer/browsers';
7
7
  import type { Options } from '@wdio/types';
8
- export type ChromedriverParameters = InstallOptions & Omit<EdgedriverParameters, 'port' | 'edgeDriverVersion' | 'customEdgeDriverPath'>;
8
+ export type ChromedriverParameters = Partial<InstallOptions> & Omit<EdgedriverParameters, 'port' | 'edgeDriverVersion' | 'customEdgeDriverPath'>;
9
9
  declare global {
10
10
  namespace WebdriverIO {
11
11
  interface ChromedriverOptions extends ChromedriverParameters {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/driver/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAyB,MAAM,oBAAoB,CAAA;AAO1D,OAAO,EAA8B,KAAK,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC7G,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAA0C,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAA;AAQxD,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,mBAAmB,GAAG,sBAAsB,CAAC,CAAA;AACvI,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,WAAW,CAAC;QAClB,UAAU,mBAAoB,SAAQ,sBAAsB;SAAG;QAC/D,UAAU,kBAAmB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC;SAAG;QAC3E,UAAU,iBAAkB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC;SAAG;QACzE,UAAU,mBAAoB,SAAQ,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC;SAAG;KAChF;CACJ;AAKD,wBAAsB,cAAc,CAAE,OAAO,EAAE,OAAO,CAAC,SAAS,wCA+H/D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/driver/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAyB,MAAM,oBAAoB,CAAA;AAO1D,OAAO,EAA8B,KAAK,mBAAmB,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAC7G,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EAA0C,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAgB,OAAO,EAAE,MAAM,aAAa,CAAA;AAQxD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,mBAAmB,GAAG,sBAAsB,CAAC,CAAA;AAChJ,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,WAAW,CAAC;QAClB,UAAU,mBAAoB,SAAQ,sBAAsB;SAAG;QAC/D,UAAU,kBAAmB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC;SAAG;QAC3E,UAAU,iBAAkB,SAAQ,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC;SAAG;QACzE,UAAU,mBAAoB,SAAQ,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC;SAAG;KAChF;CACJ;AAKD,wBAAsB,cAAc,CAAE,OAAO,EAAE,OAAO,CAAC,SAAS,wCAmJ/D"}
@@ -9,7 +9,7 @@ import { deepmerge } from 'deepmerge-ts';
9
9
  import { start as startSafaridriver } from 'safaridriver';
10
10
  import { start as startGeckodriver } from 'geckodriver';
11
11
  import { start as startEdgedriver, findEdgePath } from 'edgedriver';
12
- import { parseParams, setupChrome, definesRemoteDriver, setupChromedriver, isChrome, isFirefox, isEdge, isSafari, getCacheDir } from './utils.js';
12
+ import { parseParams, setupPuppeteerBrowser, definesRemoteDriver, setupChromedriver, isChrome, isFirefox, isEdge, isSafari, getCacheDir } from './utils.js';
13
13
  import { SUPPORTED_BROWSERNAMES } from '../constants.js';
14
14
  const log = logger('@wdio/utils');
15
15
  const DRIVER_WAIT_TIMEOUT = 10 * 1000; // 10s
@@ -49,7 +49,7 @@ export async function startWebDriver(options) {
49
49
  * Chrome
50
50
  */
51
51
  const chromedriverOptions = caps['wdio:chromedriverOptions'] || {};
52
- const { executablePath: chromeExecuteablePath, browserVersion } = await setupChrome(cacheDir, caps);
52
+ const { executablePath: chromeExecuteablePath, browserVersion } = await setupPuppeteerBrowser(cacheDir, caps);
53
53
  const { executablePath: chromedriverExcecuteablePath } = chromedriverOptions.binary
54
54
  ? { executablePath: chromedriverOptions.binary }
55
55
  : await setupChromedriver(cacheDir, browserVersion);
@@ -80,7 +80,17 @@ export async function startWebDriver(options) {
80
80
  /**
81
81
  * Firefox
82
82
  */
83
- const geckodriverOptions = caps['wdio:geckodriverOptions'] || {};
83
+ const { executablePath } = await setupPuppeteerBrowser(cacheDir, caps);
84
+ caps['moz:firefoxOptions'] = deepmerge({ binary: executablePath }, caps['moz:firefoxOptions'] || {});
85
+ /**
86
+ * the "binary" parameter refers to the driver binary in the WebdriverIO.GeckodriverOptions and
87
+ * to the Firefox binary in the driver option
88
+ */
89
+ delete caps.browserVersion;
90
+ const { binary, ...geckodriverOptions } = caps['wdio:geckodriverOptions'] || {};
91
+ if (binary) {
92
+ geckodriverOptions.customGeckoDriverPath = binary;
93
+ }
84
94
  driver = 'GeckoDriver';
85
95
  driverProcess = await startGeckodriver({ ...geckodriverOptions, cacheDir, port });
86
96
  }
@@ -88,7 +98,10 @@ export async function startWebDriver(options) {
88
98
  /**
89
99
  * Microsoft Edge
90
100
  */
91
- const edgedriverOptions = caps['wdio:edgedriverOptions'] || {};
101
+ const { binary, ...edgedriverOptions } = caps['wdio:edgedriverOptions'] || {};
102
+ if (binary) {
103
+ edgedriverOptions.customEdgeDriverPath = binary;
104
+ }
92
105
  driver = 'EdgeDriver';
93
106
  driverProcess = await startEdgedriver({ ...edgedriverOptions, cacheDir, port }).catch((err) => {
94
107
  log.warn(`Couldn't start EdgeDriver: ${err.message}, retry ...`);
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/driver/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAyFxD,wBAAsB,WAAW,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,kBAAkB,kCAazH;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,kBAAkB,kCAepH"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/driver/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAgGxD,wBAAsB,WAAW,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,kBAAkB,kCAezH;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,kBAAkB,kCAYpH"}
@@ -1,7 +1,12 @@
1
1
  import logger from '@wdio/logger';
2
- import { getCacheDir, definesRemoteDriver, isSafari, isEdge, isFirefox, isChrome, setupChromedriver, setupEdgedriver, setupGeckodriver, setupChrome } from './utils.js';
2
+ import { getCacheDir, definesRemoteDriver, getDriverOptions, isSafari, isEdge, isFirefox, isChrome, setupChromedriver, setupEdgedriver, setupGeckodriver, setupPuppeteerBrowser } from './utils.js';
3
3
  const log = logger('@wdio/utils');
4
4
  const UNDEFINED_BROWSER_VERSION = null;
5
+ var BrowserDriverTaskLabel;
6
+ (function (BrowserDriverTaskLabel) {
7
+ BrowserDriverTaskLabel["BROWSER"] = "browser binaries";
8
+ BrowserDriverTaskLabel["DRIVER"] = "browser driver";
9
+ })(BrowserDriverTaskLabel || (BrowserDriverTaskLabel = {}));
5
10
  function mapCapabilities(options, caps, task, taskItemLabel) {
6
11
  const capabilitiesToRequireSetup = (Array.isArray(caps)
7
12
  ? caps.map((cap) => {
@@ -25,13 +30,15 @@ function mapCapabilities(options, caps, task, taskItemLabel) {
25
30
  })).flat().filter((cap) => (
26
31
  /**
27
32
  * only set up driver if
28
- * - browserName is defined so we know it is a browser session
29
- * - we are not about to run a cloud session
30
- * - we are not running Safari (driver already installed on macOS)
31
33
  */
34
+ // - browserName is defined so we know it is a browser session
32
35
  cap.browserName &&
36
+ // - we are not about to run a cloud session
33
37
  !definesRemoteDriver(options) &&
34
- !isSafari(cap.browserName)));
38
+ // - we are not running Safari (driver already installed on macOS)
39
+ !isSafari(cap.browserName) &&
40
+ // - driver options don't define a binary path
41
+ !getDriverOptions(cap).binary));
35
42
  /**
36
43
  * nothing to setup
37
44
  */
@@ -71,13 +78,15 @@ export async function setupDriver(options, caps) {
71
78
  return setupEdgedriver(cacheDir, cap.browserVersion);
72
79
  }
73
80
  else if (isFirefox(cap.browserName)) {
74
- return setupGeckodriver(cacheDir, cap.browserVersion);
81
+ // "latest" works for setting up browser only but not geckodriver
82
+ const version = cap.browserVersion === 'latest' ? undefined : cap.browserVersion;
83
+ return setupGeckodriver(cacheDir, version);
75
84
  }
76
85
  else if (isChrome(cap.browserName)) {
77
86
  return setupChromedriver(cacheDir, cap.browserVersion);
78
87
  }
79
88
  return Promise.resolve();
80
- }, 'browser driver');
89
+ }, BrowserDriverTaskLabel.DRIVER);
81
90
  }
82
91
  export function setupBrowser(options, caps) {
83
92
  return mapCapabilities(options, caps, async (cap) => {
@@ -86,13 +95,9 @@ export function setupBrowser(options, caps) {
86
95
  // not yet implemented
87
96
  return Promise.resolve();
88
97
  }
89
- else if (isFirefox(cap.browserName)) {
90
- // not yet implemented
91
- return Promise.resolve();
92
- }
93
- else if (isChrome(cap.browserName)) {
94
- return setupChrome(cacheDir, cap);
98
+ else if (isChrome(cap.browserName) || isFirefox(cap.browserName)) {
99
+ return setupPuppeteerBrowser(cacheDir, cap);
95
100
  }
96
101
  return Promise.resolve();
97
- }, 'browser binaries');
102
+ }, BrowserDriverTaskLabel.BROWSER);
98
103
  }
@@ -1,13 +1,17 @@
1
1
  import type { EdgedriverParameters } from 'edgedriver';
2
2
  import type { Options, Capabilities } from '@wdio/types';
3
3
  export declare function parseParams(params: EdgedriverParameters): string[];
4
- export declare function getLocalChromePath(): string | undefined;
5
- export declare function getBuildIdByPath(chromePath?: string): string | undefined;
4
+ export declare function getBuildIdByChromePath(chromePath?: string): string | undefined;
5
+ export declare function getBuildIdByFirefoxPath(firefoxPath?: string): Promise<string | undefined>;
6
6
  export declare const downloadProgressCallback: (artifact: string, downloadedBytes: number, totalBytes: number) => void;
7
- export declare function setupChrome(cacheDir: string, caps: Capabilities.Capabilities): Promise<{
7
+ export declare function setupPuppeteerBrowser(cacheDir: string, caps: Capabilities.Capabilities): Promise<{
8
8
  executablePath: string;
9
9
  browserVersion: string | undefined;
10
+ } | {
11
+ executablePath: string | undefined;
12
+ browserVersion: string;
10
13
  }>;
14
+ export declare function getDriverOptions(caps: Capabilities.Capabilities): WebdriverIO.ChromedriverOptions | WebdriverIO.GeckodriverOptions | WebdriverIO.EdgedriverOptions;
11
15
  export declare function getCacheDir(options: Pick<Options.WebDriver, 'cacheDir'>, caps: Capabilities.Capabilities): string;
12
16
  export declare function setupChromedriver(cacheDir: string, driverVersion?: string): Promise<{
13
17
  executablePath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/driver/utils.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAOxD,wBAAgB,WAAW,CAAC,MAAM,EAAE,oBAAoB,YAYvD;AAED,wBAAgB,kBAAkB,uBAOjC;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,sBAenD;AAGD,eAAO,MAAM,wBAAwB,aAAc,MAAM,mBAAmB,MAAM,cAAc,MAAM,SAOrG,CAAA;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY;;;GA4DlF;AAaD,wBAAgB,WAAW,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,UAGzG;AAED,wBAAsB,iBAAiB,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;;GA8DhF;AAED,wBAAgB,gBAAgB,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,mBAEzE;AAED,wBAAgB,eAAe,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,mBAExE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC,WAQ/H;AAED,wBAAgB,QAAQ,CAAE,WAAW,CAAC,EAAE,MAAM,WAE7C;AACD,wBAAgB,QAAQ,CAAE,WAAW,CAAC,EAAE,MAAM,WAE7C;AACD,wBAAgB,SAAS,CAAE,WAAW,CAAC,EAAE,MAAM,WAE9C;AACD,wBAAgB,MAAM,CAAE,WAAW,CAAC,EAAE,MAAM,WAE3C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/driver/utils.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAOxD,wBAAgB,WAAW,CAAC,MAAM,EAAE,oBAAoB,YAYvD;AAED,wBAAgB,sBAAsB,CAAC,UAAU,CAAC,EAAE,MAAM,sBAiBzD;AAED,wBAAsB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,+BAiBjE;AAGD,eAAO,MAAM,wBAAwB,aAAc,MAAM,mBAAmB,MAAM,cAAc,MAAM,SAOrG,CAAA;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY;;;;;;GAwE5F;AAED,wBAAgB,gBAAgB,CAAE,IAAI,EAAE,YAAY,CAAC,YAAY,oGAShE;AAED,wBAAgB,WAAW,CAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,YAAY,UAGzG;AAED,wBAAsB,iBAAiB,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;;GA8DhF;AAED,wBAAgB,gBAAgB,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,mBAEzE;AAED,wBAAgB,eAAe,CAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,mBAExE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC,WAQ/H;AAED,wBAAgB,QAAQ,CAAE,WAAW,CAAC,EAAE,MAAM,WAE7C;AACD,wBAAgB,QAAQ,CAAE,WAAW,CAAC,EAAE,MAAM,WAE7C;AACD,wBAAgB,SAAS,CAAE,WAAW,CAAC,EAAE,MAAM,WAE9C;AACD,wBAAgB,MAAM,CAAE,WAAW,CAAC,EAAE,MAAM,WAE3C"}
@@ -6,10 +6,10 @@ import cp from 'node:child_process';
6
6
  import got from 'got';
7
7
  import decamelize from 'decamelize';
8
8
  import logger from '@wdio/logger';
9
- import { getChromePath } from 'chrome-launcher';
10
9
  import { install, canDownload, resolveBuildId, detectBrowserPlatform, Browser, ChromeReleaseChannel, computeExecutablePath } from '@puppeteer/browsers';
11
10
  import { download as downloadGeckodriver } from 'geckodriver';
12
11
  import { download as downloadEdgedriver } from 'edgedriver';
12
+ import { locateChrome, locateFirefox } from 'locate-app';
13
13
  import { DEFAULT_HOSTNAME, DEFAULT_PROTOCOL, DEFAULT_PATH, SUPPORTED_BROWSERNAMES } from '../constants.js';
14
14
  const log = logger('webdriver');
15
15
  const EXCLUDED_PARAMS = ['version', 'help'];
@@ -26,20 +26,11 @@ export function parseParams(params) {
26
26
  .flat()
27
27
  .filter(Boolean);
28
28
  }
29
- export function getLocalChromePath() {
30
- try {
31
- const chromePath = getChromePath();
32
- return chromePath;
33
- }
34
- catch (err) {
35
- return;
36
- }
37
- }
38
- export function getBuildIdByPath(chromePath) {
29
+ export function getBuildIdByChromePath(chromePath) {
39
30
  if (!chromePath) {
40
31
  return;
41
32
  }
42
- else if (os.platform() === 'win32') {
33
+ if (os.platform() === 'win32') {
43
34
  const versionPath = path.dirname(chromePath);
44
35
  const contents = fs.readdirSync(versionPath);
45
36
  const versions = contents.filter(a => /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/g.test(a));
@@ -48,7 +39,23 @@ export function getBuildIdByPath(chromePath) {
48
39
  return oldest;
49
40
  }
50
41
  const versionString = cp.execSync(`"${chromePath}" --version`).toString();
51
- return versionString.split(' ').pop()?.trim();
42
+ return versionString.trim().split(' ').pop()?.trim();
43
+ }
44
+ export async function getBuildIdByFirefoxPath(firefoxPath) {
45
+ if (!firefoxPath) {
46
+ return;
47
+ }
48
+ if (os.platform() === 'win32') {
49
+ const appPath = path.dirname(firefoxPath);
50
+ const contents = (await fsp.readFile(path.join(appPath, 'application.ini'))).toString('utf-8');
51
+ return contents
52
+ .split('\n')
53
+ .filter((line) => line.startsWith('Version='))
54
+ .map((line) => line.replace('Version=', '').replace(/\r/, ''))
55
+ .pop();
56
+ }
57
+ const versionString = cp.execSync(`"${firefoxPath}" --version`).toString();
58
+ return versionString.trim().split(' ').pop()?.trim();
52
59
  }
53
60
  let lastTimeCalled = Date.now();
54
61
  export const downloadProgressCallback = (artifact, downloadedBytes, totalBytes) => {
@@ -59,8 +66,9 @@ export const downloadProgressCallback = (artifact, downloadedBytes, totalBytes)
59
66
  log.info(`Downloading ${artifact} ${percentage}%`);
60
67
  lastTimeCalled = Date.now();
61
68
  };
62
- export async function setupChrome(cacheDir, caps) {
69
+ export async function setupPuppeteerBrowser(cacheDir, caps) {
63
70
  caps.browserName = caps.browserName?.toLowerCase();
71
+ const browserName = caps.browserName === Browser.FIREFOX ? Browser.FIREFOX : Browser.CHROME;
64
72
  const exist = await fsp.access(cacheDir).then(() => true, () => false);
65
73
  if (!exist) {
66
74
  await fsp.mkdir(cacheDir, { recursive: true });
@@ -68,11 +76,15 @@ export async function setupChrome(cacheDir, caps) {
68
76
  /**
69
77
  * don't set up Chrome if a binary was defined in caps
70
78
  */
71
- const chromeOptions = caps['goog:chromeOptions'] || {};
72
- if (typeof chromeOptions.binary === 'string') {
79
+ const browserOptions = (browserName === Browser.CHROME
80
+ ? caps['goog:chromeOptions']
81
+ : caps['moz:firefoxOptions']) || {};
82
+ if (typeof browserOptions.binary === 'string') {
73
83
  return {
74
- executablePath: chromeOptions.binary,
75
- browserVersion: getBuildIdByPath(chromeOptions.binary)
84
+ executablePath: browserOptions.binary,
85
+ browserVersion: browserName === Browser.CHROME
86
+ ? getBuildIdByChromePath(browserOptions.binary)
87
+ : await getBuildIdByFirefoxPath(browserOptions.binary)
76
88
  };
77
89
  }
78
90
  const platform = detectBrowserPlatform();
@@ -80,41 +92,47 @@ export async function setupChrome(cacheDir, caps) {
80
92
  throw new Error('The current platform is not supported.');
81
93
  }
82
94
  if (!caps.browserVersion) {
83
- const executablePath = getLocalChromePath();
84
- const tag = getBuildIdByPath(executablePath);
95
+ const executablePath = browserName === Browser.CHROME
96
+ ? await locateChrome().catch(() => undefined)
97
+ : await locateFirefox().catch(() => undefined);
98
+ const tag = browserName === Browser.CHROME
99
+ ? getBuildIdByChromePath(executablePath)
100
+ : await getBuildIdByFirefoxPath(executablePath);
85
101
  /**
86
102
  * verify that we have a valid Chrome browser installed
87
103
  */
88
104
  if (tag) {
89
105
  return {
90
106
  executablePath,
91
- browserVersion: await resolveBuildId(Browser.CHROME, platform, tag)
107
+ browserVersion: await resolveBuildId(browserName, platform, tag)
92
108
  };
93
109
  }
94
110
  }
95
111
  /**
96
112
  * otherwise download provided Chrome browser version or "stable"
97
113
  */
98
- const tag = caps.browserVersion || ChromeReleaseChannel.STABLE;
99
- const buildId = await resolveBuildId(Browser.CHROME, platform, tag);
114
+ const tag = browserName === Browser.CHROME
115
+ ? caps.browserVersion || ChromeReleaseChannel.STABLE
116
+ : caps.browserVersion || 'latest';
117
+ const buildId = await resolveBuildId(browserName, platform, tag);
100
118
  const installOptions = {
101
119
  unpack: true,
102
120
  cacheDir,
103
121
  platform,
104
122
  buildId,
105
- browser: Browser.CHROME,
106
- downloadProgressCallback: (downloadedBytes, totalBytes) => downloadProgressCallback('Chrome', downloadedBytes, totalBytes)
123
+ browser: browserName,
124
+ downloadProgressCallback: (downloadedBytes, totalBytes) => downloadProgressCallback(`${browserName} (${buildId})`, downloadedBytes, totalBytes)
107
125
  };
108
126
  const isCombinationAvailable = await canDownload(installOptions);
109
127
  if (!isCombinationAvailable) {
110
- throw new Error(`Couldn't find a matching Chrome browser for tag "${buildId}" on platform "${platform}"`);
128
+ throw new Error(`Couldn't find a matching ${browserName} browser for tag "${buildId}" on platform "${platform}"`);
111
129
  }
112
- log.info(`Setting up Chrome v${buildId}`);
130
+ log.info(`Setting up ${browserName} v${buildId}`);
113
131
  await install(installOptions);
114
132
  const executablePath = computeExecutablePath(installOptions);
115
133
  return { executablePath, browserVersion: buildId };
116
134
  }
117
- function getDriverOptions(caps) {
135
+ export function getDriverOptions(caps) {
118
136
  return (caps['wdio:chromedriverOptions'] ||
119
137
  caps['wdio:geckodriverOptions'] ||
120
138
  caps['wdio:edgedriverOptions'] ||
@@ -131,7 +149,7 @@ export async function setupChromedriver(cacheDir, driverVersion) {
131
149
  if (!platform) {
132
150
  throw new Error('The current platform is not supported.');
133
151
  }
134
- const version = driverVersion || getBuildIdByPath(getLocalChromePath()) || ChromeReleaseChannel.STABLE;
152
+ const version = driverVersion || getBuildIdByChromePath(await locateChrome()) || ChromeReleaseChannel.STABLE;
135
153
  const buildId = await resolveBuildId(Browser.CHROMEDRIVER, platform, version);
136
154
  let executablePath = computeExecutablePath({
137
155
  browser: Browser.CHROMEDRIVER,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wdio/utils",
3
- "version": "8.15.7",
3
+ "version": "8.15.9",
4
4
  "description": "A WDIO helper utility to provide several utility functions used across the project.",
5
5
  "author": "Christian Bromann <mail@bromann.dev>",
6
6
  "homepage": "https://github.com/webdriverio/webdriverio/tree/main/packages/wdio-utils",
@@ -33,7 +33,6 @@
33
33
  "@puppeteer/browsers": "^1.6.0",
34
34
  "@wdio/logger": "8.11.0",
35
35
  "@wdio/types": "8.15.7",
36
- "chrome-launcher": "^1.0.0",
37
36
  "decamelize": "^6.0.0",
38
37
  "deepmerge-ts": "^5.1.0",
39
38
  "edgedriver": "^5.3.5",
@@ -41,11 +40,12 @@
41
40
  "get-port": "^7.0.0",
42
41
  "got": "^13.0.0",
43
42
  "import-meta-resolve": "^3.0.0",
43
+ "locate-app": "^2.1.0",
44
44
  "safaridriver": "^0.1.0",
45
45
  "wait-port": "^1.0.4"
46
46
  },
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "24d8f0dccf54e6e19779094d73eb90ae9086ee86"
50
+ "gitHead": "86eec4b2a71da7dcfaa0f021db32c8035e0ff06a"
51
51
  }