一、 Appium工作原理
基本工作流程如下:
- Appium提供了一套web服务,Appium起一个Server(4723端口),用于与脚本client通信。
- server接收web driver(即appium client)标准请求,解析请求内容,调用对应的框架响应操作。
- Appium Server把请求转发给android中设备上的间件Bootstrap.jar,Bootstrap接收appium的命令(4724端口),底层通过调用UiAutomator命令执行操作。
- 同时由Bootstrap将执行结果返回给appium server。
原理图:
两个端口:
- 4723: appium server与自动化脚本client的通信
- 4724: Appium server于手机设备通信
二、Appium优点
- 跨平台
- 跨应用
- 跨架构:支持Native和Webview两种架构
- 跨语言:不限制脚本编写语言
- 其他:不依赖源码、不需要重新签名、不限制测试框架和平台(eg:TESTNG,JTEST)
三、用例编写流程
1、启动appium server;
2、init driver;
DesiredCapabilities设置:app、device、platformName、deviceName、udid、超时等
3、用例执行:模拟用户进行UI操作;
4、测试完成:
1. 卸载app:removeapp
2. driver退出:driver.quit()
四、常用API之元素定位
Appium元素定位方式依赖于Selenium,因此,Selenium的定位方式,Appium都支持,也支持Android和ios原生的定位方式。
元素定位方法:
方法 | 含义 |
---|---|
findElementById | 元素的ID属性 |
findElementsByName | 元素的name属性 |
findElementByTagName | 元素的标签名 |
findElementsByClassName | 元素的class属性 |
findElementByCssSelector | Selenium最强大的定位方法,比xpath速度快,但比xpath难上手 |
findElementByXPath | 什么是Xpath |
findElementByCssSelector | Selenium 最强大的定位方法,比 xpath 速度快,但比 xpath 难上手 |
findElementsByLinkText | 链接元素的全部显示文字 |
findElementByPartialLinkText | 链接元素的部分显示文字 |
AccessibilityId | Appium中用于替代name定位方式,Android-主要使用元素的content-desc属性;iOS-使用元素的label或name |
findElementByAndroidUIAutomator(new UiSelector().text(text)) | 通过文本查找 |
Android常用方法:id、className、xpath、AndroidUIAutomator、AccessibilityId.
(一)AndroidUIAutomator支持的元素定位属性
index(int index)
text(String text)
resourceId(String id)
className(String className)
packageName(String packageName)
description(String desc)
checked(boolean val)
clickable(boolean val)
enabled(boolean val)
longClickable(boolean val)
password(boolean val)
selected(boolean val)
instance(int val)
特点:元素的所有属性都可以用做定位,功能非常强大且速度很快。
(二)xpath元素定位
1.使用绝对路径
driver.findElementByXPath("className/className/className/className");
2.使用相对路径
driver.findElementByXPath("//className");
3.使用元素的索引
driver.findElementByXPath("//className[index]");
4.通过元素的属性定位
driver.findElementByXPath("//className[@label=\'XXX\'][@isVisible=\'1\']");
五、常用API之driver支持操作
//元素操作
webElement.click();
webElement.sendkeys();
//文件传输
driver.pushFile(remotePath, file);
driver.pullFile(remotePath);
//启动activity
driver.startActivity(activity);
//APP操作
driver.installApp(appPath);
driver.resetApp();
driver.launchApp();
driver.closeApp();
driver.removeApp(bundleId);
六、常用API之断言
Assert.assertTrue(boolean);
Assert.assertFalse(boolean);
Assert.assertSame(expected, actual);
Assert.assertEquals(expected, actual);
AndroidDriverWait:等待XXX元素出现
原理参考:https://blog.csdn.net/jffhy2017/article/details/69220719