一.简介:
Appium采用CS架构,客户端测试用例可采用多种语言编程,跟服务端建立一个session,服务端解析后发送指令到手机进行交互。
支持Native app(通过本地的控件访问),Web app(使用移动浏览器访问的应用)Hybrid app(本地app内嵌webview加载网页内容),通过context切换上下文。
appium类库封装了标准Selenium客户端类库,实际对手机的操作使用android的Uiautomator或IOS的Uiautomation。因此Uiautomator有的毛病appium有,Uiautomator没有的毛病appium也可能有。总之坑深而路远啊。
二.环境搭建:
JDK
SDK:配置ANDROID_HOME
node_js:(非必须,安装后可使用cmd启动appium服务端)
Appium server: node-modle的bin目录放进path
以上配置完成后,使用appium-doctor检查所需要的环境是否配置成功
客户端Java工程依赖jar包:jdk版本和selenium有不兼容的情况,我采用jdk1.7,其余版本如下。其中java-client在appium官网下载,selenium*在selenium官网下载。
三.编写测试用例
举例一个最基本的登录操作
在启动session时必须提供Desired Capabilities, Desired Capabilities本质上是以 key value 字典的方式存放,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试,可写在setup中。
teardown中断开session
用例中执行相关操作以及断言。
public class AppiumTestJunit {
AndroidDriver driver;
@Before
public void setUp() throws Exception {
DesiredCapabilities cap=new DesiredCapabilities();
//设备 adb devices查看
cap.setCapability("deviceName","127.0.0.1:62001");
//手机系统版本
cap.setCapability("platformVersion", "5.0");
//测试引擎,默认Appium,API-level<17的情况下设置为selendriod
cap.setCapability("automationName", "Appium");
//必填,测试平台,iOS,Android,Firefox OS
cap.setCapability("platformName", "Android");
//apk文件路径,appium运行时会先尝试安装再开始测试,如果没有的话,会根据appActivity和appPackage去目标机器查找目标app
//cap.setCapability("app", "C:\\Users\\Administrator\\Desktop\\apks\\vcm-release-2.6.0(6).apk");
//安卓必填 被测应用程序的包名
cap.setCapability("appPackage", "com.checheyun.vcm");
//被测应用程序启动的Activity的名称
cap.setCapability("appActivity", ".MainActivity");
//appium服务端超过设置的时间没有收到消息时认为客户端退出,默认60
cap.setCapability("newCommandTimeout", 60);
//等待测试设备ready的超时时间
cap.setCapability("devicereadyTimeout", 30);
//是否启用支持unicode的键盘
cap.setCapability("unicodeKeyboard", true);
//session结束后是否重置键盘
cap.setCapability("resetKeyboard", true);
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), cap);
//设置全局隐式等待30S
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@After
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void test() {
WebElement username=driver.findElementByXPath("//android.widget.EditText[@text=\"请输入手机号\"]");
username.sendKeys("xxxxxx");
WebElement passwd=driver.findElementByXPath("//android.widget.ScrollView/android.view.View/android.view.View[2]/android.widget.EditText");
passwd.sendKeys("123456");
driver.findElementByAndroidUIAutomator("new UiSelector().description(\"login_btn\")").click();
//driver.findElementByAccessibilityId("login_btn").click();
WebElement me=driver.findElementByXPath("//*[contains(@content-desc,\"bottom_icon\")]/android.view.View[5]/android.widget.TextView");
String me_cont=me.getText();
assertTrue("mebtn not exist",me_cont.equals("我的"));
}
}