UNPKG

appium-chromium-driver

Version:

Appium driver for Chromium-based browsers that work with Chromedriver

93 lines (84 loc) 3.43 kB
import type {BrowserInfo} from '../types'; import {deployDriverArtifact, locateDriverExecutableInDir} from './deployment'; import {isMsEdge} from './browser-identity'; import {discoverBrowserVersion, getBrowserCandidates} from './browser-candidates'; import {fetchDriverArchive, resolveDriverVersionForBrowser} from './download'; import {getDriverExecutableName, getPlatformConfig} from './platform'; import {getDefaultDriverDir} from './storage'; import {Version} from './version'; interface DriverResolveOpts { browserName?: string; executable?: string; executableDir?: string; } /** * Determine the MSEdgeDriver executable path for the current session request. * It returns opts.executable if it is provided. * If not, it checks whether the browser is Microsoft Edge and returns undefined for non-Edge sessions. * For Edge sessions it prefers an existing executable from opts.executableDir, then falls back to * resolving, downloading, and deploying a compatible driver artifact when autodownload is enabled. * If any step fails for a Microsoft Edge session, it throws an error. * @param opts The options for resolving the driver executable. * @param browserVersionInfo The information about the browser version. * @param isAutodownloadEnabled Whether autodownload is enabled (default: true). * @returns The path to the driver executable, or undefined if it cannot be resolved. * @throws Error if the browser is Microsoft Edge but the executable cannot be resolved. */ export async function determineDriverExecutable( opts: DriverResolveOpts, browserVersionInfo?: BrowserInfo, isAutodownloadEnabled = true, ): Promise<string | undefined> { if (opts.executable) { return opts.executable; } if (!isMsEdge(opts.browserName)) { return undefined; } const executableName = getDriverExecutableName(); if (opts.executableDir) { const explicitExecutable = await locateDriverExecutableInDir( opts.executableDir, executableName, ); if (explicitExecutable) { return explicitExecutable; } } if (!isAutodownloadEnabled) { return undefined; } const browserVersionStr = browserVersionInfo?.info?.Browser; if (!browserVersionStr) { throw new Error( 'Could not determine the installed Microsoft Edge version required for autodownload. ' + 'Provide ms:edgeOptions.binary or appium:executable.', ); } const browserVersion = Version.from(browserVersionStr); const executableDir = opts.executableDir || getDefaultDriverDir(); try { const driverVersion = await resolveDriverVersionForBrowser(browserVersion); const artifact = { archiveName: getPlatformConfig().archiveName, executableName, version: driverVersion.toString(), }; return await deployDriverArtifact(artifact, executableDir, async (archivePath) => { await fetchDriverArchive(driverVersion, archivePath); }); } catch (err) { throw new Error( `Failed to resolve MSEdgeDriver executable for Edge version '${browserVersion}' ` + `in '${executableDir}': ${(err as Error).message}`, {cause: err}, ); } } export {getDefaultDriverDir, isMsEdge}; export { discoverBrowserVersion as discoverMsEdgeBrowserVersion, getBrowserCandidates as getMsEdgeBrowserCandidates, determineDriverExecutable as determineMsEdgeDriverExecutable, getDefaultDriverDir as getDefaultMsEdgeDriverDir, };