UNPKG

appium-webdriveragent

Version:
253 lines 8.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.selectWdaStartupStrategyName = selectWdaStartupStrategyName; exports.createWdaStartupStrategy = createWdaStartupStrategy; exports.createDefaultWdaHostOps = createDefaultWdaHostOps; exports.createDefaultSimulatorWdaHostOps = createDefaultSimulatorWdaHostOps; exports.createDefaultRealDevicePreinstalledHostOps = createDefaultRealDevicePreinstalledHostOps; exports.createDefaultRealDeviceXcodebuildHostOps = createDefaultRealDeviceXcodebuildHostOps; const teen_process_1 = require("teen_process"); const support_1 = require("@appium/support"); const utils_1 = require("./utils"); const WDA_AGENT_PORT = 8100; const HOST_OPS_REQUIRED_MESSAGE = 'Host operations must be provided to launch or terminate preinstalled WebDriverAgent'; class ExistingWdaUrlStrategy { ctx; name = 'existing-url'; constructor(ctx) { this.ctx = ctx; } async launch(sessionId) { this.ctx.log.info(`Using provided WebdriverAgent at '${this.ctx.webDriverAgentUrl}'`); this.ctx.setUrl(this.ctx.webDriverAgentUrl); this.ctx.setupProxies(sessionId); return await this.ctx.getStatus(); } async quit() { this.ctx.log.debug('Stopping neither xcodebuild nor XCTest session since WDA lifecycle is not managed by this driver'); } } class SimulatorWdaStrategy { ctx; name = 'simulator'; constructor(ctx) { this.ctx = ctx; } async launch(sessionId) { if (this.ctx.usePreinstalledWDA) { return await launchPreinstalled(this.ctx, this.ctx.hostOps.simulator, sessionId); } return await launchWithXcodebuild(this.ctx, sessionId); } async quit() { if (this.ctx.usePreinstalledWDA) { await terminatePreinstalled(this.ctx, this.ctx.hostOps.simulator); return; } await quitXcodebuild(this.ctx); } } class RealDeviceXcodebuildStrategy { ctx; name = 'real-device-xcodebuild'; constructor(ctx) { this.ctx = ctx; } async launch(sessionId) { return await launchWithXcodebuild(this.ctx, sessionId); } async quit() { await quitXcodebuild(this.ctx); } } class RealDevicePreinstalledStrategy { ctx; name = 'real-device-preinstalled'; constructor(ctx) { this.ctx = ctx; } async launch(sessionId) { return await launchPreinstalled(this.ctx, this.ctx.hostOps.realDevicePreinstalled, sessionId); } async quit() { await terminatePreinstalled(this.ctx, this.ctx.hostOps.realDevicePreinstalled); } } /** * Selects the WDA startup strategy for the provided launch arguments. */ function selectWdaStartupStrategyName(args) { if (args.webDriverAgentUrl) { return 'existing-url'; } if (!args.realDevice) { return 'simulator'; } if (args.usePreinstalledWDA) { return 'real-device-preinstalled'; } return 'real-device-xcodebuild'; } /** * Creates a WDA startup strategy for the current facade state. */ function createWdaStartupStrategy(ctx) { const startupStrategy = selectWdaStartupStrategyName({ realDevice: ctx.isRealDevice, webDriverAgentUrl: ctx.webDriverAgentUrl, usePreinstalledWDA: ctx.usePreinstalledWDA, }); switch (startupStrategy) { case 'existing-url': return new ExistingWdaUrlStrategy(ctx); case 'simulator': return new SimulatorWdaStrategy(ctx); case 'real-device-preinstalled': return new RealDevicePreinstalledStrategy(ctx); case 'real-device-xcodebuild': return new RealDeviceXcodebuildStrategy(ctx); default: throw new Error(`Unknown WDA startup strategy: ${startupStrategy}`); } } /** * Creates default host operations for flows the package can own directly. */ function createDefaultWdaHostOps() { return { simulator: createDefaultSimulatorWdaHostOps(), realDevicePreinstalled: createDefaultRealDevicePreinstalledHostOps(), realDeviceXcodebuild: createDefaultRealDeviceXcodebuildHostOps(), }; } /** * Creates default simulator host operations. */ function createDefaultSimulatorWdaHostOps() { return { async launchPreinstalled() { throw new Error(HOST_OPS_REQUIRED_MESSAGE); }, async terminate() { throw new Error(HOST_OPS_REQUIRED_MESSAGE); }, async resetTestProcesses({ udid, isSimulator }) { await (0, utils_1.resetTestProcesses)(udid, isSimulator); }, }; } /** * Creates default real-device preinstalled host operations. */ function createDefaultRealDevicePreinstalledHostOps() { return { async launchPreinstalled() { throw new Error(HOST_OPS_REQUIRED_MESSAGE); }, async terminate() { throw new Error(HOST_OPS_REQUIRED_MESSAGE); }, }; } /** * Creates default real-device xcodebuild host operations. */ function createDefaultRealDeviceXcodebuildHostOps() { return { async resetTestProcesses({ udid, isSimulator }) { await (0, utils_1.resetTestProcesses)(udid, isSimulator); }, async cleanupObsoleteProcesses({ udid, port, commandLineIncludes }) { const obsoletePids = await (0, utils_1.getPIDsListeningOnPort)(port, (cmdLine) => cmdLine.includes(commandLineIncludes) && !cmdLine.toLowerCase().includes(udid.toLowerCase())); if (obsoletePids.length > 0) { await (0, teen_process_1.exec)('kill', obsoletePids); } }, }; } async function launchWithXcodebuild(ctx, sessionId) { ctx.log.info('Launching WebDriverAgent on the device'); ctx.setupProxies(sessionId); if (!ctx.useXctestrunFile && !(await support_1.fs.exists(ctx.agentPath))) { throw new Error(`Trying to use WebDriverAgent project at '${ctx.agentPath}' but the ` + 'file does not exist'); } if (ctx.useXctestrunFile || ctx.usePrebuiltWDA) { ctx.log.info('Skipped WDA project cleanup according to the provided capabilities'); } else { await ctx.cleanupProjectIfFresh(); } const resetTestProcesses = ctx.isRealDevice ? ctx.hostOps.realDeviceXcodebuild.resetTestProcesses : ctx.hostOps.simulator.resetTestProcesses; await resetTestProcesses?.({ udid: ctx.device.udid, isSimulator: !ctx.isRealDevice, }); const xcodebuild = ctx.xcodebuild(); await xcodebuild.init(ctx.noSessionProxy()); if (ctx.prebuildWDA) { await xcodebuild.prebuild(); } return (await xcodebuild.start()); } async function launchPreinstalled(ctx, hostOps, sessionId) { const xctestEnv = createPreinstalledWdaEnvironment(ctx); ctx.log.info('Launching WebDriverAgent on the device without xcodebuild'); await hostOps.launchPreinstalled({ udid: ctx.device.udid, bundleId: ctx.bundleIdForXctest, env: xctestEnv, wdaLocalPort: ctx.wdaLocalPort, wdaRemotePort: ctx.wdaRemotePort, platformName: ctx.platformName, platformVersion: ctx.platformVersion, timeoutMs: ctx.wdaLaunchTimeout, }); ctx.setupProxies(sessionId); let status; try { status = await ctx.getStatus(ctx.wdaLaunchTimeout); } catch { throw new Error(`Failed to start the preinstalled WebDriverAgent in ${ctx.wdaLaunchTimeout} ms. ` + `The WebDriverAgent might not be properly built or the device might be locked. ` + `The 'appium:wdaLaunchTimeout' capability modifies the timeout.`); } ctx.setStarted(true); return status; } async function terminatePreinstalled(ctx, hostOps) { ctx.log.info('Stopping the XCTest session'); try { await hostOps.terminate({ udid: ctx.device.udid, bundleId: ctx.bundleIdForXctest, }); } catch (e) { ctx.log.warn(e.message); } } async function quitXcodebuild(ctx) { ctx.log.info('Shutting down sub-processes'); await ctx.xcodebuild().quit(); } function createPreinstalledWdaEnvironment(ctx) { const xctestEnv = { USE_PORT: ctx.wdaLocalPort || WDA_AGENT_PORT, WDA_PRODUCT_BUNDLE_IDENTIFIER: ctx.bundleIdForXctest, }; if (ctx.mjpegServerPort) { xctestEnv.MJPEG_SERVER_PORT = ctx.mjpegServerPort; } if (ctx.wdaBindingIP) { xctestEnv.USE_IP = ctx.wdaBindingIP; } if (ctx.maxHttpRequestBodySize) { xctestEnv.MAX_HTTP_REQUEST_BODY_SIZE = ctx.maxHttpRequestBodySize; } return xctestEnv; } //# sourceMappingURL=wda-strategies.js.map