基础配置篇
首先环境搭建,网络上很多,这里就不多说了;只简单列举两个连接
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:判断忽略顺序是否相等。