From 844f06609ebd7c20df50e275ce9b4d471288483a Mon Sep 17 00:00:00 2001 From: jiangyitao <451988022@163.com> Date: Thu, 12 Nov 2020 10:43:36 +0800 Subject: [PATCH] better --- .../java/com/daxiang/action/MobileAction.java | 11 +-------- .../com/daxiang/core/mobile/MobileDevice.java | 8 ++++--- .../core/mobile/android/AndroidDevice.java | 24 +++++++++++++++++-- .../android/AndroidDeviceChangeListener.java | 2 +- .../daxiang/core/mobile/ios/IosDevice.java | 12 ++-------- .../com/daxiang/core/mobile/ios/IosUtil.java | 4 ++++ .../com/daxiang/service/MobileService.java | 2 +- 7 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/daxiang/action/MobileAction.java b/src/main/java/com/daxiang/action/MobileAction.java index c00071d..26247bf 100644 --- a/src/main/java/com/daxiang/action/MobileAction.java +++ b/src/main/java/com/daxiang/action/MobileAction.java @@ -4,18 +4,15 @@ import com.daxiang.core.action.annotation.Action; import com.daxiang.core.action.annotation.Param; import com.daxiang.core.mobile.MobileDevice; -import com.daxiang.utils.FileUtil; import io.appium.java_client.AppiumDriver; import io.appium.java_client.TouchAction; import io.appium.java_client.touch.WaitOptions; import io.appium.java_client.touch.offset.PointOption; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FileUtils; import org.openqa.selenium.*; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import java.io.File; import java.io.IOException; import java.time.Duration; @@ -56,13 +53,7 @@ public void switchContext(@Param(possibleValues = "[{'value': 'NATIVE_APP', 'des @Action(id = 1001, name = "安装App", platforms = {1, 2}) public void installApp(@Param(description = "app下载地址") String appDownloadUrl) throws IOException { Assert.hasText(appDownloadUrl, "appDownloadUrl不能为空"); - - File app = FileUtil.downloadFile(appDownloadUrl); - try { - mobileDevice.installApp(app); - } finally { - FileUtils.deleteQuietly(app); - } + mobileDevice.installApp(appDownloadUrl); } @Action(id = 1002, name = "卸载App", platforms = {1, 2}) diff --git a/src/main/java/com/daxiang/core/mobile/MobileDevice.java b/src/main/java/com/daxiang/core/mobile/MobileDevice.java index 5c9b91b..a998d5a 100644 --- a/src/main/java/com/daxiang/core/mobile/MobileDevice.java +++ b/src/main/java/com/daxiang/core/mobile/MobileDevice.java @@ -10,7 +10,6 @@ import org.dom4j.DocumentException; import org.json.XML; -import java.io.File; import java.io.IOException; import java.util.Date; import java.util.Map; @@ -41,8 +40,11 @@ public MobileDevice(Mobile mobile, AppiumServer appiumServer) { public abstract void uninstallApp(String app) throws Exception; - public void installApp(File appFile) { - ((AppiumDriver) driver).installApp(appFile.getAbsolutePath()); + /** + * @param app 本地路径 or 下载地址 + */ + public void installApp(String app) { + ((AppiumDriver) driver).installApp(app); } @Override diff --git a/src/main/java/com/daxiang/core/mobile/android/AndroidDevice.java b/src/main/java/com/daxiang/core/mobile/android/AndroidDevice.java index 6a9d37c..babd53a 100644 --- a/src/main/java/com/daxiang/core/mobile/android/AndroidDevice.java +++ b/src/main/java/com/daxiang/core/mobile/android/AndroidDevice.java @@ -14,6 +14,7 @@ import com.daxiang.core.mobile.android.stf.Minitouch; import com.daxiang.core.mobile.appium.AndroidNativePageSourceHandler; import com.daxiang.core.mobile.appium.AppiumServer; +import com.daxiang.utils.FileUtil; import com.daxiang.utils.Terminal; import com.daxiang.utils.UUIDUtil; import io.appium.java_client.android.AndroidDriver; @@ -32,6 +33,7 @@ import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Files; import java.nio.file.attribute.PosixFilePermission; @@ -129,18 +131,36 @@ public boolean greaterOrEqualsToAndroid5() { } @Override - public void installApp(File appFile) { + public void installApp(String app) { + boolean appIsUrl = true; + try { + new URL(app); + } catch (MalformedURLException e) { + appIsUrl = false; + } + + if (appIsUrl) { + try { + app = FileUtil.downloadFile(app).getAbsolutePath(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + ScheduledExecutorService scheduleService = handleInstallBtnAsync(); try { // 若使用appium安装,将导致handleInstallBtnAsync无法继续处理安装时的弹窗 // 主要因为appium server无法在安装app时,响应其他请求,所以这里用ddmlib安装 - AndroidUtil.installApk(iDevice, appFile.getAbsolutePath()); + AndroidUtil.installApk(iDevice, app); } catch (InstallException e) { throw new RuntimeException(String.format("[%s]安装app失败: %s", getId(), e.getMessage()), e); } finally { if (!scheduleService.isShutdown()) { scheduleService.shutdown(); } + if (appIsUrl) { + FileUtils.deleteQuietly(new File(app)); + } } } diff --git a/src/main/java/com/daxiang/core/mobile/android/AndroidDeviceChangeListener.java b/src/main/java/com/daxiang/core/mobile/android/AndroidDeviceChangeListener.java index a3014a4..ae3d544 100644 --- a/src/main/java/com/daxiang/core/mobile/android/AndroidDeviceChangeListener.java +++ b/src/main/java/com/daxiang/core/mobile/android/AndroidDeviceChangeListener.java @@ -94,7 +94,7 @@ protected MobileDevice initMobile(IDevice iDevice, AppiumServer appiumServer) th // 安装一个测试apk,用于初始化appium driver log.info("[{}]开始安装{}", mobileId, APIDEMOS_APK); - androidDevice.installApp(new File(APIDEMOS_APK)); + androidDevice.installApp(new File(APIDEMOS_APK).getAbsolutePath()); log.info("[{}]安装{}完成", mobileId, APIDEMOS_APK); } diff --git a/src/main/java/com/daxiang/core/mobile/ios/IosDevice.java b/src/main/java/com/daxiang/core/mobile/ios/IosDevice.java index 7dd4599..4f4ae3d 100644 --- a/src/main/java/com/daxiang/core/mobile/ios/IosDevice.java +++ b/src/main/java/com/daxiang/core/mobile/ios/IosDevice.java @@ -88,16 +88,8 @@ protected Capabilities newCaps(Capabilities capsToMerge) { } @Override - public void installApp(File appFile) { - if (appFile.getName().endsWith(".ipa")) { - try { - IosUtil.installAppByIdeviceinstaller(getId(), appFile.getAbsolutePath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else { - super.installApp(appFile); - } + public void installApp(String app) { + IosUtil.installApp(driver, app); } @Override diff --git a/src/main/java/com/daxiang/core/mobile/ios/IosUtil.java b/src/main/java/com/daxiang/core/mobile/ios/IosUtil.java index 4871bc7..7b6ebf2 100644 --- a/src/main/java/com/daxiang/core/mobile/ios/IosUtil.java +++ b/src/main/java/com/daxiang/core/mobile/ios/IosUtil.java @@ -85,6 +85,10 @@ public static void installAppByIdeviceinstaller(String mobileId, String appPath) Terminal.execute(String.format(cmd, mobileId, appPath)); } + public static void installApp(RemoteWebDriver driver, String app) { + driver.executeScript("mobile: installApp", ImmutableMap.of("app", app)); + } + public static void uninstallApp(RemoteWebDriver driver, String bundleId) { driver.executeScript("mobile: removeApp", ImmutableMap.of("bundleId", bundleId)); } diff --git a/src/main/java/com/daxiang/service/MobileService.java b/src/main/java/com/daxiang/service/MobileService.java index d9461c1..4223884 100644 --- a/src/main/java/com/daxiang/service/MobileService.java +++ b/src/main/java/com/daxiang/service/MobileService.java @@ -33,7 +33,7 @@ public void installApp(MultipartFile app, String mobileId) { try { FileUtils.copyInputStreamToFile(app.getInputStream(), appFile); - ((MobileDevice) device).installApp(appFile); + ((MobileDevice) device).installApp(appFile.getAbsolutePath()); } catch (Exception e) { log.error("[{}]安装app失败", mobileId, e); throw new AgentException(e.getMessage());