appium端口和设备是一对一的关系,如果多台设备,都要通过手动执行命令的方式启动,过于麻烦,故直接在程序中开启appium服务,动态分配appium端口
命令:appium -a 127.0.0.1 -p 4723 -U 设备ID
程序动态开启:
public AppiumDriverLocalService startAppiumServer(StfDevicesFields fields) {
//检测appium服务是否已经启动
boolean isServerRunning = checkIfServerIsRunnning(fields);
if (isServerRunning) {
return service;
}
int port = fields.getAppiumServerPort();
AppiumServiceBuilder builder = new AppiumServiceBuilder();
builder.withIPAddress("127.0.0.1");
builder.usingPort(port);
builder.withArgument(GeneralServerFlag.SESSION_OVERRIDE);
builder.withArgument(GeneralServerFlag.LOG_LEVEL, "error");
//Start the server with the builder
service = AppiumDriverLocalService.buildService(builder);
service.start();
return service;
}
判断appium服务是否已经启动:
在linux服务可以通过以下方式检测
public boolean checkIfServerIsRunnning(StfDevicesFields fields) {
boolean isServerRunning = false;
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(fields.getAppiumServerPort());
serverSocket.close();
} catch (IOException e) {
isServerRunning = true;
} finally {
serverSocket = null;
}
return isServerRunning;
}
在mac中,以上方式就不适用了,只能通过命令查找端口方式来处理
例如:lsof -i:4723 存在进程,则根据想要的结果处理即可
appium+android
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, fields.getDeviceName()); // 设备名称
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");// 平台名称
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, fields.getVersion());// 系统版本号
capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, "com.xx.xxxxx");// 包名
capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, ".ui.SplashAnimActivity");
capabilities.setCapability(MobileCapabilityType.UDID, fields.getSerial());// 物理机的id
capabilities.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, fields.getSystemPort());
capabilities.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD, false);
capabilities.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD, false);
capabilities.setCapability(MobileCapabilityType.NO_RESET, true);
String path = "http://127.0.0.1:" + fields.getAppiumServerPort() + "/wd/hub";
URL url = new URL(path);
AndroidDriver driver = new AndroidDriver(url, capabilities);
//等待应用启动OK
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
android设备多台并行的时候,需要动态设置systemport ,避免冲突。
appium+ios
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(MobileCapabilityType.UDID, fields.getSerial());// 设备ID
cap.setCapability(MobileCapabilityType.DEVICE_NAME, fields.getDeviceName()); // 设备名称
cap.setCapability(MobileCapabilityType.PLATFORM_NAME, "iOS");// 平台名称
cap.setCapability(MobileCapabilityType.PLATFORM_VERSION, fields.getVersion());// 系统版本号
cap.setCapability(IOSMobileCapabilityType.BUNDLE_ID, "com.xx.xxxxxxx");
cap.setCapability(MobileCapabilityType.NO_RESET, true);
cap.setCapability(MobileCapabilityType.AUTOMATION_NAME, "XCUITest");
cap.setCapability(IOSMobileCapabilityType.AUTO_ACCEPT_ALERTS, true);
cap.setCapability(IOSMobileCapabilityType.WDA_LOCAL_PORT, fields.getWdaLocalPort());
cap.setCapability(IOSMobileCapabilityType.USE_NEW_WDA, false);
cap.setCapability(IOSMobileCapabilityType.START_IWDP, true);
cap.setCapability(IOSMobileCapabilityType.USE_PREBUILT_WDA, true);
cap.setCapability("useSimpleBuildTest",true);
cap.setCapability("wdaConnectionTimeout", 240000);
String path = "http://127.0.0.1:" + fields.getAppiumServerPort() + "/wd/hub";
driver = new IOSDriver<IOSElement>(new URL(path), cap);
driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
ios单机测试时,wda端口会自动默认8100,但是多台设备并行时,需要自定义wda端口,避免冲突
1. wdaLocalPort:自定义wda端口 2. useNewWDA:为true, 则强制卸载设备上任何现有的WebDriverAgent应用程序,WebDriverAgent为每个会话应用不同的启动选项,默认false 3. startIWDP: 表示开启ios-webkit-debug-proxy工具 4. usePrebuiltWDA: 跳过运行WDA应用程序的构建阶段 5. useSimpleBuildTest: 这个很重要,可以设置不编译WebDriverAgentRunner-Runner.app,这样就不用重新手工信任描述文件,这个参数主要是建立与build使用和运行试验test在xcodebuild联编的所有版本的Xcode,如果是true,或建立具有build-for-testing与运行测试test-without-building超过Xcode中8,如果这是false。默认为false。