appium 自动化入门辅助篇 for Android

基础配置篇

首先环境搭建,网络上很多,这里就不多说了;只简单列举两个连接

MAC ke 查看这个链接:http://www.jianshu.com/p/dcf446c2d616

wendos 查看这个链接:

主要检查java-home android-homoe 等环境变量配置;

配置:vim .bash_profile

使配置生效:source .bash_profile

1、其次,首先要知道如何定位元素;

这里推荐一个博客,介绍的很少详细http://blog.csdn.net/vivian_ljx/article/details/54410024

2、ios .ipa 包需要开发提供;为Path 路径;

若运行一直重复闪退,则执行此命令行:

sudo chmod -R 777 /var/db/lockdown/

3、android webview 需要使用chrome浏览器 ,一:确保已连接手机(可输入 adb devices 查看 是否已连接上手机);二:chrome浏览器输入(chrome://inspect/#devices),点击 手机中需要展示的 webview 页面 就会展示在浏览器中;三:可以 查看webview 中的 元素的属性,前提是需要切换到webview ;

4、通过 text文本直接定位方法;

driver.findElementByAndroidUIAutomator("new UiSelector().text(\"http://page.banma.test.sankuai.com\")").click();

很少有文本重复的可能,如何又重复的文本,再使用其他定位方法就可以了;

5、adb 异常处理,关于adb 运行后, 启动appium 然后 adb 被杀掉,导致找不到adb devices;

第一步,指令:lsof -i tcp:5037 查看占用5037端口的 应用并显示pid 方便kill;

第二步,指令:sudo kill -9 5037 杀掉pid 为5037的进程;

6、appium 1.6.5servce 启动方法:

1 查询4723端口进程命令:ps -ef |grep 4723

2运行appium: appium -p 4723

3 然后直接run 项目就可以了;

7、使用坐标定位 问题较多 AndroidDriver.tap(次数,x,y,执行时间);不好使

而APPIUM官方上说用TouchAction 解决一些 点击,长按 滑动 等交互问题

前提需要把context切换回 native,点击才会生效;

如下:

TouchAction action = new TouchAction(BaseTestCase.androidDriver);

//action.tap(891, 1817).perform();//我试着这样写 不生效

BaseTestCase.androidDriver.performTouchAction(action.tap(891, 1680));//这样ok

8、滑动页面 案例 向上滑动

/**

* 向上滑动屏幕

*

* @param during

*/

public void swipeToUp(int during) {

  MethodUtil.NativeWebView(false);

  int width = BaseTestCase.androidDriver.manage().window().getSize().width;

  int height = BaseTestCase.androidDriver.manage().window().getSize().height;

  BaseTestCase.androidDriver.swipe(width / 4 * 3, height / 4 * 3, width / 4, height      / 4, during);



}

9、处理APP中弹窗

//签到成功弹窗

popup = driver.findElements(By.className("modal-button-bold"));



try {

Thread.sleep(1500);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (popup.size() > 0) {

//此处可获取子元素(取消、确认按钮等 还有弹窗标题,内容等做进一步校验)

//WebElement title= popup.findElement(By.className("title"));
//...


popup.get(0).click();



System.out.println("此处处理了弹窗: 签到成功弹窗");

}

错误笔记

一:appium 报错 -------erro: chrome >=60(chromedriver=2.32)

解决办法:需要使用满足要去的 chrome 版本 切 必须 与使用Chrome 对应的 chromdriver 版本 这里 我使用了chrome 61 对应的 Chromedriver 2.32;

7、input 搜索框中文本空件 没有ID、className ,或者是动态的,可通过标签名来定位;

//给文本框输入文本//*[@id="searchModal1499939674002"]/div[1]/div[2]/input

WebElement inputtext = driver.findElement(By.tagName("input"));

inputtext.sendKeys("自动化测试文案");

8、在很多情况中,尤其是H5,会遇到 明明通过ID定位的,但是还是会提示 是不可点击的,不是唯一的,所以换一种思路,通过文本定位,driver.findElement(By.linkText("已审批"));

9、Android 定位 在新版本后 不再支持 ByName("文本"),而需要使用

findElementByAndroidUIAutomator("text(\"使用拍照\")");

10、如何获取图片及其他元素的属性值进行断言

假如获取的是个集合,那么需要list.get(索引).getAttribute("src"));即获取src属性值;

同样textar 也是通过getText()也获取不到value值,那么可通过getAttribute("value")获取值;

如:

String str=BaseTestCase.androidDriver.findElement(By.id("appealExplain")).getAttribute("value");

done ,并不是说有的属性都可以获取到;

11、自动化滑动加速度值

12、appium service 1.6.3/1.6.4 及以上版本 会存在一个漏洞 针对Android 7.0 手机 执行click() 无响应,需切换UIaotumation 2

第一:appium版本要高于1.63

第二:启动的时候要声明automation版本

第三:保障5037端口不被占用(必须切换此端口)

13、报错 pom 文件未找到,即 org.testng主类无法加载 等 错误

解决思路 第一 先命令行进入项目目录

第二 mvn clean -DskipTests assembly:assembly

第三 编译成功后,即可上传云测处理

(3)分层页面的定位

分层页面的意思就是 外面有一个框 里面那一层是填进去的图片 就这样子

图片加载完毕之后 默认驻留在里面图片那一层 

这时候直接点击外面那一层上的【确定】按钮 就点不到 

所以应该在 xpath 的基础上 增加 name 属性和 label 属性 就这样

print("\n---------------------------点击【确定】---------------------------")

self.driver.find_element_by_xpath(

"//UIAApplication[1]/UIAWindow[1]/UIANavigationBar[1]/UIAButton[3][@name='确定'][@label='确定']").click()

(4) UIDatePicker 的操作

所谓 UIDatePicker 很多人天天用 就是不知道名字 下面这个鬼就是

它的操作 其实是 UIAPickerWheel 控件的 send_keys 方法

print("\n---------------------------选择【广东】---------------------------")

self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAScrollView[1]/UIAButton[3]").click()

self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAPicker[1]/UIAPickerWheel[1]").send_keys(

"广东")

以上控件操作的执行效果 有兴趣的同学可以在自己的项目中试一试

14: appium 针对listView 等列表数据 分页加载的元素无法定位,需封装个方法,滑动一下,获取一次,直到获取到自己 需要找的元素为止;

具体思路:

(1、定义一个 循环(while或 do while)

(2、滑动页面一次,获取一次元素,

(3、如果 获取的元素 的 text是自己要找的 文本,即 成功,退出循环即可

(4、如果 想找到倒数第二条item的数据,则需要校验 是否无更多数据了,然后 list.gatsize()-1 即可

15:appium 针对引导页,最后一页的元素无法获取的问题,可以获取,加大等待时长

Thread.sleep(3000); 后 再次获取

testNG断言篇

导入依赖 : import static org.testng.Assert.*;

TestNG中提供了一个Assert类:org.testng.Assert,该类继承了:java.lang.Object类。从TesNG的官方文档中,我们可以看到,org.testng.Assert类是作为放置一系列断言的静态方法的容器。这些断言方法基本上是有2个或三个输入参数,参数的顺序是 actualValue(实际值), expectedValue(期望值);

断言的方法有以下几种

(1) assertTrue:判断是否为True。

例:Assert.assertTrue(list.size()>0,"退出登录失败");

(2) assertFalse:判断是否为false。

(3) assertSame:判断引用地址是否相同。

(4) assertNotSame:判断引用地址是否不相同。

(5) assertNull:判断是否为null。

(6) assertNotNull:判断是否不为null。

(7) assertEquals:判断是否相等,Object类型的对象需要实现haseCode及equals方法。

例:Assert.assertEquals(isExis,"人工爆单_总调度员","登录失败");

System.out.println("----------登录成功-------------");

(8) assertNotEquals:判断是否不相等。

(9) assertEqualsNoOrder:判断忽略顺序是否相等。

猜你喜欢

转载自blog.csdn.net/fanaw/article/details/81505029