1、手势操作-下拉
下拉刷新示例:
public static void swipeDown(AppiumDriver androidDriver){ int width = androidDriver.manage().window().getSize().getWidth(); int height = androidDriver.manage().window().getSize().getHeight(); int startx = width/2; int endx = width/2; int starty = height/4; int endy = height*3/4; TouchAction touchAction = new TouchAction(androidDriver); Duration dd = Duration.ofMillis(500); touchAction.press(startx, starty).waitAction(dd).moveTo(endx, endy).release().perform(); }
2、手势操作-多点触摸(放大缩小)-屏幕解锁
MultiTouchAction类可以模拟用户多点触摸操作 主要包含有add()和perform()两个方法 可以结合TouchAction模拟多根手指滑动效果
示例:放大
@Test public void testMultiSwipe(){ int width = androidDriver.manage().window().getSize().getWidth(); int height = androidDriver.manage().window().getSize().getHeight(); PointOption pointOptionA = PointOption.point(width/5,height/5); PointOption pointOptionB = PointOption.point(width*2/5,height*2/5); PointOption pointOptionC = PointOption.point(width*3/5,height*3/5); PointOption pointOptionD = PointOption.point(width*4/5,height*4/5); //放大手势操作 //手指1 B(0.4,0.4)->A(0.2,0.2) TouchAction touchAction1 = new TouchAction(androidDriver); touchAction1.press(pointOptionB).moveTo(pointOptionA).release(); //手指2 C(0.6,0.6)->D(0.8,0.8) TouchAction touchAction2 = new TouchAction(androidDriver); touchAction2.press(pointOptionC).moveTo(pointOptionD).release(); //让这两根手指的滑动动作同时开始滑动--MultiTouchAction MultiTouchAction multiTouchAction = new MultiTouchAction(androidDriver); multiTouchAction.add(touchAction1); multiTouchAction.add(touchAction2); //最后让多点触摸手势动作生效 multiTouchAction.perform(); }
示例:屏幕解锁-六等分得到每个圆圈的中心点
@Test public void testUnlock(){ //不同分辨率手机屏幕兼容性问题-所以不用具体值,六等分计算 //1、先根据ID找到解锁区域元素 WebElement webElement = androidDriver.findElement(MobileBy.id("com.xxzb.fenwoo:id/lpv_password")); //2、获取解锁区域起始点坐标信息(X,Y) int X = webElement.getLocation().getX(); int Y = webElement.getLocation().getY(); //3、获取解锁区域的宽度/高度 int width = webElement.getSize().getWidth(); int height = webElement.getSize().getHeight(); PointOption pointOption1 = PointOption.point(width/6+X,height/6+Y); PointOption pointOption2 = PointOption.point(width*3/6+X,height/6+Y); PointOption pointOption3 = PointOption.point(width*5/6+X,height/6+Y); PointOption pointOption4 = PointOption.point(width*3/6+X,height*3/6+Y); PointOption pointOption5 = PointOption.point(width/6+X,height*5/6+Y); PointOption pointOption6 = PointOption.point(width*3/6+X,height*5/6+Y); PointOption pointOption7 = PointOption.point(width*5/6+X,height*5/6+Y); TouchAction touchAction = new TouchAction(androidDriver); touchAction.press(pointOption1).moveTo(pointOption2). moveTo(pointOption3).moveTo(pointOption4).moveTo(pointOption5). moveTo(pointOption6).moveTo(pointOption7).release().perform(); }
3、不清楚原来的缓存数据,免得有些需要重新配置,比如刚开机要设置手机的语言之类的
在通过代码启动测试App不用把App的数据清除掉 desiredCapabilities.setCapability("noReset",true);
4、webview Hybrid应用-有个切换到web的动作
切换到web页面中去
androidDriver.context("WEBVIEW_com.lemon.lemonban");
5、Hybrid应用自动化
基于UIAutomator+ChromeDriver,native部分走UIAutomator,webview部分走Chromedriver,两者结合混搭,从而实现Hybrid自动化。
准备工作
- step1:准备android 4.4+版本以上的手机/模拟器
- step2:在app源码中将webview调试模式打开(重要)--让开发打开
webview.setWebContentsDebuggingEnabled(true);
- step3:安装UC开发者工具 -识别App内嵌的web页面元素信息
识别web页面元素
- 1. UC开发者工具识别webview版本(Chrome浏览器版本),找匹配的chromeDriver-http://npm.taobao.org/mirrors/chromedriver
替换到以下目录:
C:UsersAdministratorAppDataLocalProgramsAppium esourcesapp ode_modulesappium ode_modulesappium-chromedriver
- 2. UC开发者工具识别web页面元素
http://npm.taobao.org/mirrors/chromedriver--下载对应驱动的链接
脚本编写
- step1:识别 - webview视图
- step2:获取所有的contexts:
driver.getContextHandles();
- step3:切换 context- webview名字
driver.context(webview名字);
- step4:定位 - 定位webview中的元素,并执行操作:web网页元素定位和操作。
- step5:切换 - 切换回默认的视图:
driver.context(native视图)
6、context理解
在程序中context我们可以理解为当前对象在程序中所处的一个环境/状态
native界面和webview界面分属于不同的context,前者基于Andriod原生控件,后者是Web网页
native默认是”NATIVE_APP”,webview则默认是”WEBVIEW_被测进程名称”
两者的运行环境不同因此需要进行上下文(context)切换
显示布局边界-有框框的是native,没有的就是webview
7、代码示例:
@Test public void testHybrid() throws InterruptedException { //1、进入到柠檬社区web中 androidDriver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text("柠檬社区")")).click(); Thread.sleep(5000); //2、获取到所有的context 模式(原生页面模式+web页面模式) Set<String> contexts = androidDriver.getContextHandles(); //System.out.println(contexts); //3、切换到web页面中去 androidDriver.context("WEBVIEW_com.lemon.lemonban"); //4、定位web页面元素,操作 //切换了web的模式 ,不再是手机模式 androidDriver.findElement(By.linkText("注册")).click(); //点击注册的展开区域 androidDriver.findElement(By.id("verifyGitHubIcon")).click(); //输入用户名 androidDriver.findElement(By.id("userName")).sendKeys("lemonban"); //输入邮箱 androidDriver.findElement(By.id("userEmail")).sendKeys("1425301899@qq.com"); // }