Appium自动化测试入门教程No.7—— Desired Capabilities

366 阅读3分钟
原文链接: zhuanlan.zhihu.com

Desired Capabilities

Desired Capabilities携带了一些配置信息。从本质上讲,它是key-value形式的对象。可以理解成是java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。

Desired Capabilities最重要的作用是告诉appium server本次测试的上下文。

比如:

本次测试是启动浏览器还是启动移动设备?

是启动andorid还是启动ios?

启动android时,app的package是什么?

启动android时,app的activity是什么?

....

appium server的这些疑问Desired Capabilities都必须给予解答,否则appium server就无法完成移动app或者是浏览器的启动。

Appium 的 Desired Capabilities 基本配置步骤如下:

1、新增android.properties文件

!--server地址 -->
serverURL=http://127.0.0.1:4723/wd/hub

#<!--automationName为selendroid or appium,如果sdk版本>=17请使用appium;如果sdk版本<=17请使用selendroid -->
automationName=Appium

#<!-- 测试平台 iOS和Android -->
platformName=Android

#<!-- 平台版本 -->
platformVersion=5.0.2

#<!-- 设备名字,可随意起名字,但是要有意义 -->
deviceName=APD-CMS-AutoTest

#<!-- android app路径 -->
androidAppPath=res/app/android/android-debug.apk
iosAppPath=XXXX

#<!--使用appium的输入法,支持中文并隐藏键盘-->
unicodeKeyboard=true

#<!-- 重置键盘输入法 -->
resetKeyboard=true

#<!--不重签名app-->
noSign=true

#<!--设置driver超时时间,单位s-->
newCommandTimeout=600

#<!--appWaitActivity,这个参数的值写的是app启动后真正的界面activity-->
appWaitActivity=com.cccis.cms.release.r1.MainActivity

#<!--app的包 -->
appPackage=com.cccis.cms.release.r1

#<!--app的 activity -->
appActivity=com.cccis.cms.release.r1.MainActivity

#<!--deviceReadyTimeout修改appium判断设备正常响应的超时时间,默认是5秒-->
deviceReadyTimeout=30

fullReset=true
#<!--设备UDID iPhone真机使用或者android并行测试可以使用 -->
udid=78e99c1c

#<!-- 设置为true之后会覆盖当前session -->
sessionOverride=true

#<!-- 页面元素15秒不出现超时时间 -->
elementTimeOut=15

2、新增DriverConfig java文件,获取properties文件中各参数的值

package com.cccis.cms.base;

import com.cccis.cms.utils.PropertiesUtil;
import org.apache.commons.configuration.Configuration;

public class DriverConfig{
static Configuration appset= PropertiesUtil.getCommonsPropertis("android.properties");
//appium server地址
public static String serverURL=appset.getString("serverURL");

//测试引擎名字
public static String automationName=appset.getString("automationName");

//测试平台名字
public static String platformName=appset.getString("platformName");

//测试平台版本号
public static String platformVersion=appset.getString("platformVersion");

//设备名字
public static String deviceName=appset.getString("deviceName");

//ios app的路径
public static String iosAppPath=appset.getString("iosAppPath");

//android app路径
public static String androidAppPath=appset.getString("androidAppPath");

//android app的 package
public static String appPackage=appset.getString("appPackage");

//android app的activity
public static String appActivity=appset.getString("appActivity");

public static String appWaitActivity=appset.getString("appWaitActivity");

//安卓独有 - 是否使用unicode键盘,使用此键盘可以输入中文字符
public static boolean unicodeKeyboard= Boolean.parseBoolean(appset.getString("unicodeKeyboard"));

//android独有 - 是否重置键盘,如果设置了unicodeKeyboard键盘,可以将此参数设置为true,然后键盘会重置为系统默认的
public static boolean resetKeyboard=Boolean.parseBoolean(appset.getString("resetKeyboard"));

//是否覆盖已有的seesssion,这个用于多用例执行,如果不设置的话,会提示前一个session还没有结束,用例就不能继续执行了
public static boolean sessionOverride=Boolean.parseBoolean(appset.getString("sessionOverride"));

//设备udid
public static String udid=appset.getString("udid");

//元素等待超时时间
public static int elementTimeOut= Integer.valueOf(appset.getString("elementTimeOut"));

public static boolean fullReset=Boolean.parseBoolean(appset.getString("fullReset"));

public static int deviceReadyTimeout=Integer.valueOf(appset.getString("deviceReadyTimeout"));

public static int newCommandTimeout=Integer.valueOf(appset.getString("newCommandTimeout"));

public static boolean noSign=Boolean.parseBoolean(appset.getString("noSign"));

}

3、新增InitDriver类,初始化DesiredCapabilities对象

package com.cccis.cms.base;

import com.cccis.cms.utils.AppiumUtil;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import java.io.File;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;
import org.testng.ITestContext;
import org.testng.annotations.Test;


public class InitDriver {
//声明driver
public static AppiumDriver<WebElement> driver;

//声明ITestContext,用于获取testng配置文件内容
public static ITestContext testContext;

//声明DesiredCapabilities
public static DesiredCapabilities capabilities= new DesiredCapabilities();

//实例化本类的日志输出对象
public static Logger logger = Logger.getLogger(InitDriver.class);

public static AppiumDriver<WebElement> selectDriver(String platformName,AppiumUtil appiumUtil){

capabilities = new DesiredCapabilities();
//设置capability,以便和appium创建session
capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, DriverConfig.platformName);
capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, DriverConfig.platformVersion);
capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, DriverConfig.deviceName);
capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, DriverConfig.automationName);
capabilities.setCapability("sessionOverride", DriverConfig.sessionOverride);
//如果测试平台是android的话,执行下面这个if语句内容
if(platformName.equalsIgnoreCase("android")){
/**
* 设置和android 测试相关的capability并实例化driver对象
* */
capabilities.setCapability(MobileCapabilityType.APP, new File(DriverConfig.androidAppPath).getAbsolutePath());
capabilities.setCapability(AndroidMobileCapabilityType.UNICODE_KEYBOARD, DriverConfig.unicodeKeyboard);
capabilities.setCapability(AndroidMobileCapabilityType.RESET_KEYBOARD, DriverConfig.resetKeyboard);
capabilities.setCapability(AndroidMobileCapabilityType.APP_PACKAGE, DriverConfig.appPackage);
capabilities.setCapability(AndroidMobileCapabilityType.APP_ACTIVITY, DriverConfig.appActivity);

driver = appiumUtil.getDriver(DriverConfig.serverURL, capabilities,platformName);
http://logger.info(platformName+"已经启动");
driver.manage().timeouts().implicitlyWait(DriverConfig.elementTimeOut, TimeUnit.SECONDS);
return driver;

//如果测试平台是ios的话,执行下面这个if语句内容
}else if(platformName.equalsIgnoreCase("ios")){
/**
* 设置和ios 测试相关的capability并实例化driver对象
* */
capabilities.setCapability(MobileCapabilityType.APP, new File(DriverConfig.iosAppPath).getAbsolutePath());
//ios设置自动接收系统alert,注意IOS弹出的alert,APPIUM可以自动处理掉,支持ios8以上系统
capabilities.setCapability("autoAcceptAlerts", true);
driver = appiumUtil.getDriver(DriverConfig.serverURL, capabilities,platformName);
http://logger.info(platformName+"已经启动");
driver.manage().timeouts().implicitlyWait(DriverConfig.elementTimeOut,TimeUnit.SECONDS);

}else{
logger.error("初始化driver失败");
Assert.fail("初始化driver失败");
}

//最后返回dirver对象
return driver;
}

@Test
public static void test() {
AppiumUtil appiumUtil = new AppiumUtil();
String platformName = DriverConfig.platformName;
InitDriver.selectDriver(platformName,appiumUtil);
}

}