appium-webdriveragent
Version:
Package bundling WebDriverAgent
253 lines • 8.73 kB
JavaScript
;
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