From b1e29fd07341295b639330c652035d7605003b7e Mon Sep 17 00:00:00 2001 From: "yineng.huang" Date: Fri, 18 Apr 2025 15:45:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9ios=E3=80=81harmony=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8C=96=E6=88=AA=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constants/UpperComputerConstant.java | 5 + .../controller/EngineController.java | 94 ++++++++++-- .../deviceManager/AbstractDeviceManager.java | 5 + .../deviceManager/DeviceManager.java | 1 + .../thread/MacIosDeviceInitThread.java | 13 ++ .../WindowsAndLinuxIosDeviceInitThread.java | 7 + .../service/AbstractDebuggerService.java | 69 +++++++-- .../service/HarmonyDebuggerServiceImpl.java | 135 ++++++++++++++++++ .../service/IosDebuggerServiceImpl.java | 9 +- .../element/mobile/keywords/CommonTools.java | 20 +-- 10 files changed, 323 insertions(+), 35 deletions(-) create mode 100644 cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/HarmonyDebuggerServiceImpl.java diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/UpperComputerConstant.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/UpperComputerConstant.java index 45f047a..4ae4fd7 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/UpperComputerConstant.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/constants/UpperComputerConstant.java @@ -41,4 +41,9 @@ public class UpperComputerConstant { */ public static final String IOS = "1"; + + /** + * harmony类型常量 + */ + public static final String HARMONY = "2"; } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/EngineController.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/EngineController.java index 577a9b2..1140fc6 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/EngineController.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/controller/EngineController.java @@ -31,6 +31,9 @@ public class EngineController { @Resource(name = "iosService") private DebuggerService iosService; + @Resource(name = "harmonyService") + private DebuggerService harmonyService; + @ApiOperation(value = "获取设备驱动") @PostMapping("/getDriver") @@ -83,8 +86,10 @@ public class EngineController { logger.info("screen shot in device[{}]...............",info.getDeviceId()); if (UpperComputerConstant.IOS.equals(info.getPlatform())) { result = iosService.getScreenShot(info); - } else { + } else if (UpperComputerConstant.ANDROID.equals(info.getPlatform())){ result = androidService.getScreenShot(info); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + result = harmonyService.getScreenShot(info); } return result; } @@ -146,17 +151,31 @@ public class EngineController { @ApiOperation(value = "android清除数据") @PostMapping("/cleanData") public boolean cleanData(@RequestBody DebuggerDeviceInfo info){ - return androidService.cleanData(info.getDeviceId(), info.getAppPackage()); + boolean success = true; + if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { + success = androidService.cleanData(info.getDeviceId(),info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(info.getPlatform())){ + success = iosService.cleanData(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + success = harmonyService.cleanData(info.getDeviceId(), info.getAppPackage()); + } else { + logger.warn("设备【{}】在获取应用版本的时候设备的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); + } + return success; } @ApiOperation(value = "获取包版本") @PostMapping("/getPackageVersion") public String getPackageVersion(@RequestBody DebuggerDeviceInfo info){ String version = ""; - if (UpperComputerConstant.IOS.equals(info.getPlatform())) { + if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { + version = androidService.getPackageVersion(info.getDeviceId(),info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(info.getPlatform())){ version = iosService.getPackageVersion(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + version = harmonyService.getPackageVersion(info.getDeviceId(), info.getAppPackage()); } else { - version = androidService.getPackageVersion(info.getDeviceId(), info.getAppPackage()); + logger.warn("设备【{}】在获取应用版本的时候设备的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); } return version; } @@ -173,8 +192,12 @@ public class EngineController { boolean result = false; if (UpperComputerConstant.IOS.equals(info.getPlatform())) { result = iosService.startRecord(info); - } else { + } else if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { result = androidService.startRecord(info); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())){ + result = harmonyService.startRecord(info); + } else { + logger.warn("设备【{}】在开启录屏的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); } return result; } @@ -183,11 +206,14 @@ public class EngineController { @PostMapping("/endRecord") public String endRecord(@RequestBody DebuggerDeviceInfo info){ String result = null; - logger.info("收到引擎结束记录的入参:{}", JSONObject.toJSONString(info)); if (UpperComputerConstant.IOS.equals(info.getPlatform())) { result = iosService.endRecord(info); - } else { + } else if (UpperComputerConstant.ANDROID.equals(info.getPlatform())){ result = androidService.endRecord(info); + }else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())){ + result = harmonyService.endRecord(info); + } else { + logger.warn("设备【{}】在结束录屏的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); } return result; } @@ -200,7 +226,18 @@ public class EngineController { @ApiOperation(value = "ios是否安装某一个包") @PostMapping("/isAppInstalled") public boolean isAppInstalled(@RequestBody DebuggerDeviceInfo info){ - return iosService.isAppInstalled(info.getDeviceId(), info.getAppPackage()); + String platform = info.getPlatform(); + boolean isInstalled = false; + if (UpperComputerConstant.ANDROID.equals(platform)) { + isInstalled = androidService.isAppInstalled(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(platform)) { + isInstalled = iosService.isAppInstalled(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(platform)) { + isInstalled = harmonyService.isAppInstalled(info.getDeviceId(), info.getAppPackage()); + } else { + logger.warn("设备【{}】在判断应用是否安装的类型未定义,类型:{}", info.getDeviceId(), platform); + } + return isInstalled; } /** @@ -211,7 +248,18 @@ public class EngineController { @ApiOperation(value = "移除ios某一个包") @PostMapping("/removeApp") public boolean removeApp(@RequestBody DebuggerDeviceInfo info){ - return iosService.removeApp(info.getDeviceId(), info.getAppPackage()); + String platform = info.getPlatform(); + boolean remove = false; + if (UpperComputerConstant.ANDROID.equals(platform)) { + remove = androidService.removeApp(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(platform)) { + remove = iosService.removeApp(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(platform)) { + remove = harmonyService.removeApp(info.getDeviceId(), info.getAppPackage()); + } else { + logger.warn("设备【{}】在移除应用的类型未定义,类型:{}", info.getDeviceId(), platform); + } + return remove; } /** @@ -225,10 +273,14 @@ public class EngineController { boolean result = false; int times = 0; while (times < 3) { - if (UpperComputerConstant.IOS.equals(info.getPlatform())) { - result = iosService.installApp(info.getDeviceId(), info.getAppPath(), info.getAppPackage()); + if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { + result = androidService.installApp(info.getDeviceId(), info.getAppPath(),info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(info.getPlatform())) { + result = iosService.installApp(info.getDeviceId(), info.getAppPath(),info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + result = harmonyService.installApp(info.getDeviceId(), info.getAppPath(),info.getAppPackage()); } else { - result = androidService.installApp(info.getDeviceId(), info.getAppPath(), info.getAppPackage()); + logger.warn("设备【{}】在安装应用的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); } if (result) { break; @@ -247,8 +299,12 @@ public class EngineController { } if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { success = androidService.activeApp(info.getDeviceId(),info.getAppPackage()); - } else { + } else if (UpperComputerConstant.IOS.equals(info.getPlatform())){ success = iosService.activeApp(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + success = harmonyService.activeApp(info.getDeviceId(), info.getAppPackage()); + } else { + logger.warn("设备【{}】在启动应用的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); } return success; } @@ -312,7 +368,17 @@ public class EngineController { @ApiOperation(value = "关闭App") @PostMapping("/terminateApp") public boolean terminateApp(@RequestBody DebuggerDeviceInfo info){ - return iosService.terminateApp(info.getDeviceId(), info.getAppPackage()); + boolean success = false; + if (UpperComputerConstant.ANDROID.equals(info.getPlatform())) { + success = androidService.terminateApp(info.getDeviceId(),info.getAppPackage()); + } else if (UpperComputerConstant.IOS.equals(info.getPlatform())){ + success = iosService.terminateApp(info.getDeviceId(), info.getAppPackage()); + } else if (UpperComputerConstant.HARMONY.equals(info.getPlatform())) { + success = harmonyService.terminateApp(info.getDeviceId(), info.getAppPackage()); + } else { + logger.warn("设备【{}】在关闭应用的时候设备的类型未定义,类型:{}", info.getDeviceId(), info.getPlatform()); + } + return success; } @PostMapping("/releaseAdbForwardPort") diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AbstractDeviceManager.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AbstractDeviceManager.java index d59d931..0aa7517 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AbstractDeviceManager.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/AbstractDeviceManager.java @@ -199,4 +199,9 @@ public abstract class AbstractDeviceManager extends Thread implements DeviceMana public void setScreenInfo(String deviceId, ScreenInfo screenInfo) { this.screenInfoMap.put(deviceId, screenInfo); } + + @Override + public ScreenInfo getScreenInfo(String deviceId) { + return screenInfoMap.get(deviceId); + } } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/DeviceManager.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/DeviceManager.java index 6953e81..5998961 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/DeviceManager.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/DeviceManager.java @@ -59,6 +59,7 @@ public interface DeviceManager { public boolean checkMobileIsOnline(String serial); + public ScreenInfo getScreenInfo(String deviceId); public void setScreenInfo(String deviceId, ScreenInfo screenInfo); } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/MacIosDeviceInitThread.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/MacIosDeviceInitThread.java index a0f383c..e24d250 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/MacIosDeviceInitThread.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/MacIosDeviceInitThread.java @@ -1,6 +1,7 @@ package net.northking.cctp.upperComputer.deviceManager.thread; import com.alibaba.fastjson.JSON; +import net.northking.cctp.upperComputer.automation.entity.ScreenInfo; import net.northking.cctp.upperComputer.config.BuildWdaConfig; import net.northking.cctp.upperComputer.deviceManager.IOSDeviceManager; import net.northking.cctp.upperComputer.deviceManager.UpperComputerManager; @@ -200,6 +201,18 @@ public class MacIosDeviceInitThread extends IosDeviceInitThread { // return; // } logger.debug("注册设备信息:{}", JSON.toJSONString(deviceInfo)); + phone.setStatus(true); + ScreenInfoData screenInfoData = nkAgent.screenInfo(); + logger.debug("获取设备【{}】的初始屏幕参数:{}",phone.getUdid(),JSON.toJSONString(screenInfoData)); + ScreenInfo screenInfo = new ScreenInfo(); + Double width = screenInfoData.getWidth() * screenInfoData.getScale(); + Double height = screenInfoData.getHeight() * screenInfoData.getScale(); + Double scale = screenInfoData.getScale(); + screenInfo.setWidth(width.intValue()); + screenInfo.setHeight(height.intValue()); + screenInfo.setScale(scale.intValue()); + screenInfo.setRotation((Integer) deviceInfo.get("rotation")); + IOSDeviceManager.getInstance().setScreenInfo(phone.getUdid(),screenInfo); IOSDeviceManager.getInstance().registerDeviceToDeviceManager(deviceInfo); phone.setStatus(true); IOSDeviceManager.getInstance().publishDeviceAgentAlready(phone.getUdid()); diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/WindowsAndLinuxIosDeviceInitThread.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/WindowsAndLinuxIosDeviceInitThread.java index d2df953..ee1aeb3 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/WindowsAndLinuxIosDeviceInitThread.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/WindowsAndLinuxIosDeviceInitThread.java @@ -2,6 +2,7 @@ package net.northking.cctp.upperComputer.deviceManager.thread; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import net.northking.cctp.upperComputer.automation.entity.ScreenInfo; import net.northking.cctp.upperComputer.deviceManager.IOSDeviceManager; import net.northking.cctp.upperComputer.deviceManager.UpperComputerManager; import net.northking.cctp.upperComputer.driver.usbmuxd.AppleDevice; @@ -194,6 +195,12 @@ public class WindowsAndLinuxIosDeviceInitThread extends IosDeviceInitThread { logger.warn("设备【{}】请求创建session时出错,待会再试", phone.getUdid()); return; } + ScreenInfo screenInfo = new ScreenInfo(); + screenInfo.setWidth(width*scale); + screenInfo.setHeight(height*scale); + screenInfo.setScale(scale); + screenInfo.setRotation((Integer) deviceInfo.get("rotation")); + IOSDeviceManager.getInstance().setScreenInfo(phone.getUdid(),screenInfo); IOSDeviceManager.getInstance().publishDeviceAgentAlready(phone.getUdid()); }).start(); } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AbstractDebuggerService.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AbstractDebuggerService.java index e57abb3..87c5d9d 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AbstractDebuggerService.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/AbstractDebuggerService.java @@ -1,13 +1,17 @@ package net.northking.cctp.upperComputer.service; +import com.alibaba.fastjson.JSON; import net.northking.cctp.upperComputer.config.MobileProperty; import net.northking.cctp.upperComputer.deviceManager.UpperComputerManager; import net.northking.cctp.upperComputer.entity.DebuggerDeviceInfo; -import net.northking.cctp.upperComputer.utils.ios.IosDeviceHandleHelper; -import net.northking.cctp.upperComputer.utils.ios.LinuxAndWindowsIosHandleHelper; -import net.northking.cctp.upperComputer.utils.ios.MacIosHandleHelper; +import net.northking.cctp.upperComputer.exception.ExecuteException; +import net.northking.cctp.upperComputer.utils.HttpUtils; +import net.northking.cctp.upperComputer.utils.deviceHepler.DeviceHelper; +import net.northking.cctp.upperComputer.utils.deviceHepler.ios.LinuxAndWindowsIosHandleHelper; +import net.northking.cctp.upperComputer.utils.deviceHepler.ios.MacIosHandleHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; import org.springframework.util.CollectionUtils; import java.io.*; @@ -21,7 +25,7 @@ public abstract class AbstractDebuggerService implements DebuggerService { protected MobileProperty mobileProperty; - protected IosDeviceHandleHelper deviceHandleHelper; + protected DeviceHelper deviceHandleHelper; private final Logger logger = LoggerFactory.getLogger(AbstractDebuggerService.class); @@ -43,10 +47,6 @@ public abstract class AbstractDebuggerService implements DebuggerService { this.mobileProperty = mobileProperty; } - @Override - public boolean isAppInstalled(String deviceId, String appPackage) { - return false; - } @Override public boolean removeApp(String deviceId, String appPackage) { @@ -134,4 +134,57 @@ public abstract class AbstractDebuggerService implements DebuggerService { public boolean releaseAdbForwardPort(String deviceId) { return false; } + + protected String getScreenShot(DebuggerDeviceInfo info,int width,int height) { + File shotFile = deviceHandleHelper.getScreenShotFile(info.getDeviceId(),info.getX(),info.getY(),info.getLength(),info.getWidth(),info.getScreenLength(),info.getScreenWidth(),width,height); + String path = uploadScreenToServer(shotFile,info); + return path; + } + + protected String uploadScreenToServer(File file, DebuggerDeviceInfo info){ + String path = null; + try { + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", "Bearer " + info.getUserToken()); + path = HttpUtils.doUpload(mobileProperty.getServerAddr()+mobileProperty.getFileUploadAddr(), file,headers); + logger.info("上传截图完成:{}",path); + Map map = JSON.parseObject(path, Map.class); + if ((boolean) map.get("success")) { + path = (String) map.get("data"); + } + } catch (ExecuteException e) { + logger.error("截图失败",e); + throw e; + } catch (Exception e) { + logger.error("截图失败",e); + throw new ExecuteException("截取图片失败"); + }finally { +// if (file.exists()) { +// boolean delete = file.delete(); +// if (!delete) { +// logger.warn("临时文件【{}】删除失败",file.getAbsolutePath()); +// } +// } + } + return path; + } + @Override + public boolean cleanData(String deviceId, String packageName) { + return deviceHandleHelper.cleanData(deviceId,packageName); + } + + @Override + public boolean isAppInstalled(String deviceId, String appPackage) { + return deviceHandleHelper.isAppInstalled(deviceId, appPackage); + } + + @Override + public String getPackageVersion(String deviceId, String packageName) { + return deviceHandleHelper.getOldPackageCode(deviceId,packageName); + } + + @Override + public boolean terminateApp(String deviceId, String appPackage) { + return deviceHandleHelper.terminateApp(deviceId,appPackage); + } } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/HarmonyDebuggerServiceImpl.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/HarmonyDebuggerServiceImpl.java new file mode 100644 index 0000000..b2d509b --- /dev/null +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/HarmonyDebuggerServiceImpl.java @@ -0,0 +1,135 @@ +package net.northking.cctp.upperComputer.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import io.appium.java_client.AppiumDriver; +import net.northking.cctp.upperComputer.automation.entity.ScreenInfo; +import net.northking.cctp.upperComputer.deviceManager.HarmonyDeviceManager; +import net.northking.cctp.upperComputer.deviceManager.screen.HarmonyScreenResponseThread; +import net.northking.cctp.upperComputer.deviceManager.thread.HarmonyProvider; +import net.northking.cctp.upperComputer.driver.harmony.HarmonyDevice; +import net.northking.cctp.upperComputer.entity.DebuggerDeviceInfo; +import net.northking.cctp.upperComputer.utils.deviceHepler.harmony.HarmonyHandlerHelper; +import org.openqa.selenium.WebElement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * @author : yineng.huang + * @date : 2024/10/31 16:54 + */ +@Service("harmonyService") +public class HarmonyDebuggerServiceImpl extends AbstractDebuggerService { + + private final Logger logger = LoggerFactory.getLogger(HarmonyDebuggerServiceImpl.class); + + public HarmonyDebuggerServiceImpl() { + this.deviceHandleHelper = new HarmonyHandlerHelper(); + } + + @Override + public Object getUiTree(String deviceId) { + return null; + } + + @Override + public AppiumDriver getDriver(DebuggerDeviceInfo info) { + return null; + } + + @Override + public boolean initApp(DebuggerDeviceInfo info) { + return false; + } + + @Override + public String getScreenShot(DebuggerDeviceInfo info) { + ScreenInfo screenInfo = HarmonyDeviceManager.getInstance().getScreenInfo(info.getDeviceId()); + String path = getScreenShot(info, screenInfo.getWidth(), screenInfo.getHeight()); + return path; + } + + @Override + public boolean destroyDriver(String deviceId) { + return false; + } + + @Override + public String getScreenShotToBase64(DebuggerDeviceInfo info) { + return null; + } + + @Override + public String shotAllScreen(DebuggerDeviceInfo info) { + return null; + } + + @Override + public String uploadShotAllScreen(DebuggerDeviceInfo info) { + return null; + } + + @Override + public boolean startRecord(DebuggerDeviceInfo info) { + logger.info("收到设备【{}】在任务【{}】开启录屏的请求............",info.getDeviceId(),info.getTaskId()); + HarmonyScreenResponseThread screenThread = HarmonyDeviceManager.getInstance().getScreenThread(info.getDeviceId()); + if (null == screenThread) { + HarmonyProvider provider = HarmonyDeviceManager.getInstance().getCurrentDeviceProvider(info.getDeviceId()); + if (null == provider) { + logger.error("当前设备【{}】不在线,无法开启录频",info.getDeviceId()); + return false; + } + HarmonyDevice currentDevice = HarmonyDeviceManager.getInstance().getCurrentDevice(info.getDeviceId()); + if (null == currentDevice) { + logger.error("当前设备【{}】不在线,无法开启录频",info.getDeviceId()); + return false; + } + screenThread = new HarmonyScreenResponseThread(currentDevice); + HarmonyDeviceManager.getInstance().saveScreenThread(info.getDeviceId(), screenThread); + //开启手机端的屏幕 + boolean success = provider.startCaptureScreenImageStream(0.5f, screenThread); + logger.info("开始拉取设备【{}】的屏幕,结果:{}",info.getDeviceId(),success); + if (!success) { + logger.error("拉取设备【{}】的屏幕失败",info.getDeviceId()); + return false; + } + } + String taskId = info.getTaskId(); + String tenantId = info.getTenantId(); + String resolution = info.getResolution(); + String[] split = resolution.split("\\*"); + int width = Integer.parseInt(split[0]); + int height = Integer.parseInt(split[1]); + int isBigger = height - width; + if (isBigger < 0) { //高比宽小,换一下 + int temp = width; + width = height; + height = temp; + } + screenThread.startRecordScreen(tenantId, width, height,taskId); + return true; + } + + @Override + public String endRecord(DebuggerDeviceInfo info) { + String videoUrl = null; + logger.info("收到设备【{}】在任务【{}】关闭录屏的请求............",info.getDeviceId(),info.getTaskId()); + HarmonyScreenResponseThread screenThread = HarmonyDeviceManager.getInstance().getScreenThread(info.getDeviceId()); + if (null != screenThread) { + String result = screenThread.stopRecord(info); + JSONObject jsonObject = JSON.parseObject(result, JSONObject.class); + videoUrl = jsonObject.getString("videoUrl"); + } else { + logger.info("设备【{}】在任务【{}】录屏不存在............",info.getDeviceId(),info.getTaskId()); + } + logger.info("设备【{}】在任务【{}】录屏保存的地址:{}............",info.getDeviceId(),info.getTaskId(),videoUrl); + return videoUrl; + } + + @Override + public String getCurrentMessage(String deviceId) { + return null; + } + +} diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/IosDebuggerServiceImpl.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/IosDebuggerServiceImpl.java index ad3598c..ffc2deb 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/IosDebuggerServiceImpl.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/service/IosDebuggerServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import io.appium.java_client.AppiumDriver; +import net.northking.cctp.upperComputer.automation.entity.ScreenInfo; import net.northking.cctp.upperComputer.config.MobileProperty; import net.northking.cctp.upperComputer.deviceManager.common.PyMobileDevice; import net.northking.cctp.upperComputer.deviceManager.screen.IosScreenResponseThread; @@ -21,7 +22,7 @@ import net.northking.cctp.upperComputer.service.thread.IOSDeviceInfoByPackageThr import net.northking.cctp.upperComputer.deviceManager.IOSDeviceManager; import net.northking.cctp.upperComputer.utils.HttpUtils; import net.northking.cctp.upperComputer.utils.ScreenShotUtils; -import net.northking.cctp.upperComputer.utils.ios.MacIosHandleHelper; +import net.northking.cctp.upperComputer.utils.deviceHepler.ios.MacIosHandleHelper; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.WebElement; import org.slf4j.Logger; @@ -102,7 +103,8 @@ public class IosDebuggerServiceImpl extends AbstractDebuggerService { @Override public String getScreenShot(DebuggerDeviceInfo info) { - File shotFile = deviceHandleHelper.getScreenShotFile(info.getDeviceId(),info.getX(),info.getY(),info.getLength(),info.getWidth(),info.getScreenLength(),info.getScreenWidth()); + ScreenInfo screenInfo = IOSDeviceManager.getInstance().getScreenInfo(info.getDeviceId()); + File shotFile = deviceHandleHelper.getScreenShotFile(info.getDeviceId(),info.getX(),info.getY(),info.getLength(),info.getWidth(),info.getScreenLength(),info.getScreenWidth(),screenInfo.getWidth(), screenInfo.getHeight()); String path = null; try { HttpHeaders headers = new HttpHeaders(); @@ -155,7 +157,8 @@ public class IosDebuggerServiceImpl extends AbstractDebuggerService { @Override public String getScreenShotToBase64(DebuggerDeviceInfo info) { - File screenShotFile = deviceHandleHelper.getScreenShotFile(info.getDeviceId(),info.getX(),info.getY(),info.getLength(),info.getWidth(),info.getScreenLength(),info.getScreenWidth()); + ScreenInfo screenInfo = IOSDeviceManager.getInstance().getScreenInfo(info.getDeviceId()); + File screenShotFile = deviceHandleHelper.getScreenShotFile(info.getDeviceId(),info.getX(),info.getY(),info.getLength(),info.getWidth(),info.getScreenLength(),info.getScreenWidth(),screenInfo.getWidth(), screenInfo.getHeight()); String imgBase64 = null; try { imgBase64 = Base64.encode(screenShotFile); diff --git a/cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/CommonTools.java b/cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/CommonTools.java index e51c8de..42e6b2c 100644 --- a/cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/CommonTools.java +++ b/cctp-test-element/cctp-test-element-library/cctp-test-element-mobile/src/main/java/net/northking/cctp/element/mobile/keywords/CommonTools.java @@ -586,13 +586,13 @@ public class CommonTools { return aBoolean; } - /** - *

在控件中输入文本

- * - * @param text 输入的文本 - * @param cleanStr 是否清空文本框0-否,1-是 - * @param deviceDriver 设备连接驱动 - * @param targets 定位控件参数 + /** + * *

在控件中输入文本

+ * * + * * @param text 输入的文本 + * * @param cleanStr 是否清空文本框0-否,1-是 + * * @param deviceDriver 设备连接驱动 + * * @param targets 定位控件参数 * @param waitTimeout 超时时间 * @param waitStatusStr 是否等待屏幕稳定 * @param swipe 是否滑屏查找控件0-否,up-上滑,down-下滑,left-左滑,right-右滑 @@ -600,8 +600,8 @@ public class CommonTools { * @param preExecuteWait 执行前等待 * @param sufExecuteWait 执行后等待 * @return - */ - /*@Keyword(alias = "输入文本", category = "0", attributes = "45", commonlyUse = true) + * */ + @Keyword(alias = "输入文本", category = "0", attributes = "45", commonlyUse = true) @Return(name = "result", comment = "输入的结果", type = DataType.BOOLEAN) public boolean inputText(IExecuteContext context, @Argument(name = "text", scope = ParamScope.VARIABLES, comment = "输入的文本", type = DataType.STRING) String text, @@ -654,7 +654,7 @@ public class CommonTools { throw new ExecuteException("用户取消,执行失败"); } return aBoolean; - }*/ + } /** *

在控件中输入文本