APP自动化特殊场景元素操作&手势操作(五)
特殊场景元素操作
toast元素定位
Android中的Toast是一种简易的消息提示框。 当视图显示给用户,在应用程序中显示为浮动。和Dialog 不一样的是,它永远不会获得焦点,无法被点击。
获取方式:
匹配所有的元素,找对应的text属性值中有包含tips关键字
androidDriver.findElement(By.xpath("//*[contains(@text, 'tips')]"));
元素无法通过工具定位
eg:bilibili的登录页面、银行金融类的App、密码输入界面
原因在于:页面有做了截图限制,不能通过工具(元素定位工具、adb等)进行截图
可以通过adb命令验证页面是否做了截图限制
adb shell screencap -p /sdcard/1.png
解决方案: getPageSource API获取页面源代码信息
手势操作
滑动
滑动效果影响因素
- 滑动距离
- 滑动时间(越快滑动范围越大)
实战示例:
1.下拉刷新
/*
* 向左滑动的通用方法
* swipeTime参数:控制滑动的时间,单位为毫秒
*/
public static void swipeLeft(int swipeTime){
//获取屏幕宽度和高度
int width = driver.manage().window().getSize().getWidth();
int height = driver.manage().window().getSize().getHeight();
//定义滑动的起始点和滑动的终止点位置
//起始点:(x轴:屏幕的1/2宽度,y轴:屏幕的1/4高度)
PointOption startPoint = PointOption.point(width*3/4,height/2);
//终止点:(x轴:屏幕的1/2宽度,y轴:屏幕的3/4高度)
PointOption endPoint = PointOption.point(width/4,height/2);
TouchAction touchAction = new TouchAction(driver);
//滑动时间waitoptions类型参数
WaitOptions waitOptions = new WaitOptions();
waitOptions.withDuration(Duration.ofMillis(swipeTime));
//press:按下 moveTo:移动到目标点 release:手指抬起
touchAction.press(startPoint).waitAction(waitOptions).moveTo(endPoint).release().perform();
}
2.九宫格解锁 -- 多次连续滑动
//1、得到整个解锁图案的宽度和高度
WebElement webElement = driver.findElement(MobileBy.id("com.apple.apple2:id/lpv_password"));
int elementWidth = webElement.getSize().getWidth();
int elementHeight = webElement.getSize().getHeight();
int x = webElement.getLocation().getX();
int y= webElement.getLocation().getY();*/
//得到手势滑动几个点的坐标(先以实际点坐标调试,再做总结共性适配所有机型,这里自己去替换即可,我这里手势是Z型为例)
// 147 425 356 425 568 425(x/6,y/6)(3*x/6,y/6)(5*x/6,y/6)
// 356 636(x*/6,3*y/6)
// 147 850 356 850 568 850(x*/6,5*y/6)(3*/6,5*y/6)(5*x/6,5*y/6)
PointOption pointOption1 = PointOption.point(,425);
PointOption pointOption2 = PointOption.point(356,425);
PointOption pointOption3 = PointOption.point(568,425);
PointOption pointOption4 = PointOption.point(356,636);
PointOption pointOption5 = PointOption.point(147,850);
PointOption pointOption6 = PointOption.point(356,850);
PointOption pointOption7 = PointOption.point(568,850);
//创建TouchAction对象
TouchAction touchAction = new TouchAction(driver);
touchAction.press(pointOption1).moveTo(pointOption2).moveTo(pointOption3).moveTo(pointOption4)
.moveTo(pointOption5).moveTo(pointOption6).moveTo(pointOption7).release().perform();
3.多点触摸
MultiTouchAction类可以模拟用户多点触摸操作,主要包含有add()和perform()两个方法,可以结合 TouchAction模拟多根手指滑动效果
实例:手势放大(多点触摸)
先获取屏幕的宽和高
int width = driver.manage().window().getSize().getWidth();
int height = driver.manage().window().getSize().getHeight();
第一根手指的手势(B->A) B:0.4 A:0.2
PointOption pointOptionB = PointOption.point(width*2/5,height*2/5);
PointOption pointOptionA = PointOption.point(width/5,height/5);
第二根手指的手势(C->D) D:0.6 D:0.8
PointOption pointOptionC = PointOption.point(width*3/5,height*3/5);
PointOption pointOptionD = PointOption.point(width*4/5,height*4/5);
设置滑动
WaitOptions waitOptions = new WaitOptions();
waitOptions.withDuration(Duration.ofMillis(800));
分别创建两根手势触摸对象-TouchAction
- waitAction在单手势滑动中去设置:起始点和终止点的滑动时间
- waitAction在多手势(放大/缩小)中去设置:在起始点等待多久
TouchAction touchAction1 = new TouchAction(driver);
touchAction1.press(pointOptionB).waitAction(waitOptions).moveTo(pointOptionA).waitAction(waitOptions).release();
TouchAction touchAction2 = new TouchAction(driver);
touchAction2.press(pointOptionC).waitAction(waitOptions).moveTo(pointOptionD).waitAction(waitOptions).release();
两根手指的动作是需要同时进行的
MultiTouchAction multiTouchAction = new MultiTouchAction(driver);
multiTouchAction.add(touchAction1);
multiTouchAction.add(touchAction2);
multiTouchAction.perform();
问题:多手势滑动里面怎么解决滑动时间的坑
- 单点手势动作(滑动),waitAction设置滑动过程经历的时间(滑动的快慢)
- 多点手势动作(放大/缩小),waitAction是按下/抬起经过的时间,不能设置滑动过程经历的时间
总结
- 特殊场景元素操作:toast元素文本值获取,元素工具无法定位场景-getPageSource
- 单手势动作:滑动->通用的向下滑动、通用向左滑动,多次连续滑动->连续调用moveTo
- 多手势动作:放大/缩小 MultiTouchAction类型添加多个TouchAction滑动动作,最后调用perform