From 870d046ee8410f826f8fb1c04555c362691a76ad Mon Sep 17 00:00:00 2001 From: Sudharsan Selvaraj Date: Fri, 21 Jun 2024 16:11:23 +0530 Subject: [PATCH] Allow appium inspector to work with hub/node setup (#1192) * Add liveVideo capability to allow inspector to work with hub/node * Bump up version to 8.4.7-rc.43 --- docs/capabilities.md | 1 + documentation/docs/capabilities.md | 1 + package-lock.json | 4 ++-- package.json | 2 +- src/CapabilityManager.ts | 13 ++++++++++--- src/device-utils.ts | 13 +++++++++---- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docs/capabilities.md b/docs/capabilities.md index 3eca3547c..49b56b1e4 100644 --- a/docs/capabilities.md +++ b/docs/capabilities.md @@ -5,6 +5,7 @@ title: Capabilities | Capability Name | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | df:build | Allocate a build name in dashboard. Default value is `null`. | +| df:liveVideo | Enable live video for the session. Default value is `true`. | | df:recordVideo | Enable video recording for the session. Default value is `false`. | | df:videoTimeLimit | Maximum duration of the video recording in seconds. Default value is 1800 seconds (3 minutes). | | df:iPhoneOnly | Allocate only iPhone simulators for execution when to true. Default value is `false`. | diff --git a/documentation/docs/capabilities.md b/documentation/docs/capabilities.md index 3eca3547c..49b56b1e4 100644 --- a/documentation/docs/capabilities.md +++ b/documentation/docs/capabilities.md @@ -5,6 +5,7 @@ title: Capabilities | Capability Name | Description | | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | df:build | Allocate a build name in dashboard. Default value is `null`. | +| df:liveVideo | Enable live video for the session. Default value is `true`. | | df:recordVideo | Enable video recording for the session. Default value is `false`. | | df:videoTimeLimit | Maximum duration of the video recording in seconds. Default value is 1800 seconds (3 minutes). | | df:iPhoneOnly | Allocate only iPhone simulators for execution when to true. Default value is `false`. | diff --git a/package-lock.json b/package-lock.json index c651c387a..ff5c40861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "appium-device-farm", - "version": "8.4.7-rc.42", + "version": "8.4.7-rc.43", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "appium-device-farm", - "version": "8.4.7-rc.42", + "version": "8.4.7-rc.43", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index e5b307a1e..8d1308098 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "appium-device-farm", - "version": "8.4.7-rc.42", + "version": "8.4.7-rc.43", "description": "An appium 2.0 plugin that manages and create driver session on available devices", "main": "./lib/src/main.js", "scripts": { diff --git a/src/CapabilityManager.ts b/src/CapabilityManager.ts index 8044b9f8b..70f561b71 100644 --- a/src/CapabilityManager.ts +++ b/src/CapabilityManager.ts @@ -47,7 +47,11 @@ async function findAppPath(caps: any) { return fileName; } } -export async function androidCapabilities(caps: ISessionCapability, freeDevice: IDevice) { +export async function androidCapabilities( + caps: ISessionCapability, + freeDevice: IDevice, + options: { liveVideo: boolean }, +) { caps.firstMatch[0]['appium:app'] = await findAppPath(caps); caps.firstMatch[0]['appium:udid'] = freeDevice.udid; caps.firstMatch[0]['appium:systemPort'] = await getPort(); @@ -56,7 +60,7 @@ export async function androidCapabilities(caps: ISessionCapability, freeDevice: caps.firstMatch[0]['appium:adbPort'] = freeDevice.adbPort; if (freeDevice.chromeDriverPath) caps.firstMatch[0]['appium:chromedriverExecutable'] = freeDevice.chromeDriverPath; - if (!isCapabilityAlreadyPresent(caps, 'appium:mjpegServerPort')) { + if (!isCapabilityAlreadyPresent(caps, 'appium:mjpegServerPort') && !!options.liveVideo) { caps.firstMatch[0]['appium:mjpegServerPort'] = await getPort(); } deleteAlwaysMatch(caps, 'appium:udid'); @@ -79,13 +83,16 @@ export async function iOSCapabilities( derivedDataPath?: string; wdaBundleId?: string; }, + options: { liveVideo: boolean }, ) { caps.firstMatch[0]['appium:app'] = await findAppPath(caps); caps.firstMatch[0]['appium:udid'] = freeDevice.udid; caps.firstMatch[0]['appium:deviceName'] = freeDevice.name; caps.firstMatch[0]['appium:platformVersion'] = freeDevice.sdk; caps.firstMatch[0]['appium:wdaLocalPort'] = freeDevice.wdaLocalPort; - caps.firstMatch[0]['appium:mjpegServerPort'] = freeDevice.mjpegServerPort; + caps.firstMatch[0]['appium:mjpegServerPort'] = !!options.liveVideo + ? freeDevice.mjpegServerPort + : undefined; if (freeDevice.realDevice && !caps.firstMatch[0]['df:skipReport']) { const wdaInfo = await prisma.appInformation.findFirst({ where: { fileName: 'wda-resign.ipa' }, diff --git a/src/device-utils.ts b/src/device-utils.ts index 8f41d32e8..87af67f4e 100644 --- a/src/device-utils.ts +++ b/src/device-utils.ts @@ -103,6 +103,7 @@ export async function allocateDeviceForSession( deviceFarmCapabilities[DEVICE_FARM_CAPABILITIES.DEVICE_TIMEOUT] || deviceTimeOutMs; const intervalBetweenAttempts = deviceFarmCapabilities[DEVICE_FARM_CAPABILITIES.DEVICE_QUERY_INTERVAL] || deviceQueryIntervalMs; + const liveVideo = deviceFarmCapabilities[DEVICE_FARM_CAPABILITIES.LIVE_VIDEO] || true; try { await waitUntil( @@ -148,7 +149,7 @@ export async function allocateDeviceForSession( log.info(`📱 Blocking device ${device.udid} at host ${device.host} for new session`); // FIXME: convert this into a return value - await updateCapabilityForDevice(capability, device); + await updateCapabilityForDevice(capability, device, { liveVideo }); // update newCommandTimeout for the device. // This is required so it won't get unblocked by prematurely. @@ -170,12 +171,16 @@ export async function allocateDeviceForSession( * @param device * @returns */ -export async function updateCapabilityForDevice(capability: any, device: IDevice) { +export async function updateCapabilityForDevice( + capability: any, + device: IDevice, + options: { liveVideo: boolean }, +) { if (!device.hasOwnProperty('cloud')) { if (device.platform.toLowerCase() == DevicePlatform.ANDROID) { - await androidCapabilities(capability, device); + await androidCapabilities(capability, device, options); } else { - await iOSCapabilities(capability, device); + await iOSCapabilities(capability, device, options); } } else { log.info('Updating cloud capability for Device');