美文网首页
app九宫格解锁

app九宫格解锁

作者: testerPM | 来源:发表于2020-03-25 21:57 被阅读0次

    坐标定位九宫格解锁

    image.png

    如下图代码:有2个问题需要注意:
    (1)每个手机的分别率,尺寸大小的是不一样的,那么获取到的坐标就会发生变化
    这样代码就不是通用的了
    (2)这里没有用到waitAction-》即没有设置滑动的时间
    滑动的时间指的是:比如你认为解锁滑动的动作太慢了,那么你可以通过waitAction
    设置一个滑动时间,而这里没有设置,是因为不设置,会有一个默认的滑动时间
    (3)代码中的每个点的坐标并不是精准的坐标,而是粗略取一个值,只要这个坐标可以点中圆圈圈就可以了


    image.png

    如何解决适配问题

    (1) 通过将手机屏幕划分为三等分

    @Test
        public void test() throws InterruptedException {
            Thread.sleep(3000);
            // 1.滑动
            // startx,starty滑动起始坐标
            // endx,endy滑动终止坐标
            // duration->需要滑动多久时间,单位是毫秒
            // java-client4.2.1版本提供了swipe()方法可以直接调用,但是高版本是没有这个api的
            // 解决办法:查看swipe()方法的源代码,将源代码copy出来,自己自定义个滑动方法
            // androidDriver.swipe(432, 619, 401, 1166, 500);
    
            // swpieDown();
            continuedSwipe();
    
        }
    
        /**
         * 九宫格解锁滑动
         */
        public void continuedSwipe() {
            // 1.将屏幕宽度划分为三等分,控件高度也划分为3等分
            // 第一个点:x轴->屏幕宽度的1/6,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第二个点:x轴->屏幕宽度的3/6,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第三个点:x轴->屏幕宽度的5/6,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第四个点:x轴->屏幕宽度的3/6,y轴->控件到屏幕顶部的高度+控件高度的3/6
            // 第五个点:x轴->屏幕宽度的1/6,y轴->控件到屏幕顶部的高度+控件高度的5/6
            // 第六个点:x轴->屏幕宽度的3/6,y轴->控件到屏幕顶部的高度+控件高度的5/6
            // 第七个点:x轴->屏幕宽度的3/6,y轴->控件到屏幕顶部的高度+控件高度的5/6
            // 2.获取屏幕宽度
            int width = androidDriver.manage().window().getSize().getWidth();
            // 3.获取控件到屏幕顶部的距离
            // 3.1 定位到九宫格控件元素
            WebElement element = androidDriver.findElement(By.id("com.xxzb.fenwoo:id/lpv_password"));
            // 3.2获取控件到屏幕顶部的距离
            int distance = element.getLocation().getY();
            //获取控件到屏幕左侧的距离
            int distance2 = element.getLocation().getX();
            // 4.获取控件的高度
            int height = element.getSize().getHeight();
            // 5.将原始坐标转换成pointOption类型
            PointOption point1 = PointOption.point(width/6, distance + height / 6);
            PointOption point2 = PointOption.point(width * 3 / 6, distance + height / 6);
            PointOption point3 = PointOption.point(width * 5 / 6, distance + height / 6);
            PointOption point4 = PointOption.point(width * 3 / 6, distance + height * 3 / 6);
            PointOption point5 = PointOption.point(width / 6, distance + height * 5 / 6);
            PointOption point6 = PointOption.point(width * 3 / 6, distance + height * 5 / 6);
            PointOption point7 = PointOption.point(width * 5 / 6, distance + height * 5 / 6);
            // 6.滑动
            // 6.1实例化触摸对象-->TochAction 引入的是java_client下面的包,不能引入错误了
            TouchAction action = new TouchAction(androidDriver);
    
            action.press(point1).moveTo(point2).moveTo(point3).moveTo(point4).moveTo(point5).moveTo(point6).moveTo(point7)
                    .release();
            // 6.2让滑动生效
            action.perform();
    
        }
    
    
    

    (2)通过将九宫格控件划分为三等分

    @Test
        public void test() throws InterruptedException {
            Thread.sleep(3000);
            // 1.滑动
            // startx,starty滑动起始坐标
            // endx,endy滑动终止坐标
            // duration->需要滑动多久时间,单位是毫秒
            // java-client4.2.1版本提供了swipe()方法可以直接调用,但是高版本是没有这个api的
            // 解决办法:查看swipe()方法的源代码,将源代码copy出来,自己自定义个滑动方法
            // androidDriver.swipe(432, 619, 401, 1166, 500);
    
            // swpieDown();
            continuedSwipe();
    
        }
    
        /**
         * 九宫格解锁滑动
         */
        public void continuedSwipe() {
            // 1.将控件宽度划分为三等分,控件高度也划分为3等分
            // 第一个点:x轴->控件宽度的1/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第二个点:x轴->控件宽度的3/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第三个点:x轴->屏幕宽度的5/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的1/6
            // 第四个点:x轴->屏幕宽度的3/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的3/6
            // 第五个点:x轴->屏幕宽度的1/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的5/6
            // 第六个点:x轴->屏幕宽度的3/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的5/6
            // 第七个点:x轴->屏幕宽度的3/6+控件到y轴的距离,y轴->控件到屏幕顶部的高度+控件高度的5/6
            
            // 2.1 定位到九宫格控件元素
            WebElement element = androidDriver.findElement(By.id("com.xxzb.fenwoo:id/lpv_password"));
            // 2.2获取控件到屏幕顶部X轴的距离
            int Xdistance = element.getLocation().getY();
            //2.3获取控件到屏幕左侧y轴的距离
            int Ydistance = element.getLocation().getX();
            // 2.4获取控件的高度
            int elementHeight = element.getSize().getHeight();
            //2.5获取控件的宽度Xdistance
            int elementWidth = element.getSize().getWidth();
            // 3.将原始坐标转换成pointOption类型
            PointOption point1 = PointOption.point(Ydistance+elementWidth/6, Xdistance + elementHeight / 6);
            PointOption point2 = PointOption.point(Ydistance+elementWidth * 3 / 6, Xdistance + elementHeight  / 6);
            PointOption point3 = PointOption.point(Ydistance+elementWidth * 5 / 6, Xdistance +  elementHeight / 6);
            PointOption point4 = PointOption.point(Ydistance+elementWidth * 3 / 6,Xdistance +  elementHeight  * 3 / 6);
            PointOption point5 = PointOption.point(Ydistance+elementWidth / 6, Xdistance+  elementHeight * 5 / 6);
            PointOption point6 = PointOption.point(Ydistance+elementWidth* 3 / 6,Xdistance +  elementHeight  * 5 / 6);
            PointOption point7 = PointOption.point(Ydistance+elementWidth * 5 / 6, Xdistance +  elementHeight  * 5 / 6);
            // 4.滑动
            //5.1实例化触摸对象-->TochAction 引入的是java_client下面的包,不能引入错误了
            TouchAction action = new TouchAction(androidDriver);
    
            action.press(point1).moveTo(point2).moveTo(point3).moveTo(point4).moveTo(point5).moveTo(point6).moveTo(point7)
                    .release();
            // 5.2让滑动生效
            action.perform();
    
        }
    
    
    
    

    上面2种方法都是可以执行的。测试通过。

    注意:
    (1)包不能引入错误

    TouchAction action=new TouchAction(androidDriver);
    这段代码如果报这种错:
    The constructor TouchAction(AndroidDriver) is undefined
    原因:包引入错误
    

    引入的是java_clien里面的包,如下图:

    image.png

    (2)第一个点的坐标获取:
    1)屏幕宽度的1/6
    2)距离y轴的距离+控件宽度的1/6
    第二种方式2)获取的中心点坐标是大于第一种1)的,所以这里我们可以知道,坐标点只要在圆圈圈可点击区域即可,不用那么精准


    image.png

    (3)如何验证上面代码针对不同分别率的手机都是通用的呢?
    模拟器:设置-》性能设置-》可以调不同的分变率,然后再跑一下代码:结果是可以的

    (4)如何多次滑动:调用多个moveTo()

    action.press(point1).moveTo(point2).moveTo(point3).moveTo(point4).moveTo(point5).moveTo(point6).moveTo(point7)
                    .release();
    

    (5)如何解决适配问题:将屏幕划分三等份进行处理

    (6)避免踩坑,参考文章
    http://www.lemfix.com/topics/182

    相关文章

      网友评论

          本文标题:app九宫格解锁

          本文链接:https://www.haomeiwen.com/subject/swhfuhtx.html