20200817_多点触摸操作和Hybrid应用自动化

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");
        //
    }
原文地址:https://www.cnblogs.com/shishibuwan/p/13770559.html