• 肖sir_高级讲师__app屏幕滑动定位(006swipe方法)


    app屏幕滑动定位(swipe方法)
    swipe语法:
    Swipe(int start x,int start y,int end x,int y,time)#参数的个数根据实际情况使用
    解释:
    int start x-开始滑动的x坐标,
       int start y -开始滑动的y坐标。
       int end x -结束点x坐标,
       int end y -结束点y坐标。
       time 滑动时间(默认5毫秒)
    给swipe指定坐标,因为每个手机的屏幕分辨率不一样,指定一个固定的坐标,并不是适用所有手机,所以这里可以通过获取手机屏幕坐标实现,提升代码重用。

    python-appium手机自动测试如何实现滑动呢,在webdriver 的api中只提供了指定两个坐标的滑动,但不同的手机分辨率不同,这样写出来的自动化脚本兼容性就不是那么好了。。那么怎么实现滑动呢,仔细看了下webdriber中的方法,发现有个方法get_window_size() ,这个方法可以获得手机的宽度和高度,这样我们就可以实现按屏幕比率滑动了。。具体方法如下:
    首先我们给定固定三个参数:0.5  0.25  0.75,(参数合理就好)因为不管向上向下还是向左向右滑,他们的参数都在由大到小变化或者由小到大的变化

    理解下下面的图:
    1、屏幕的坐标图,向上滑动屏幕就是x轴不变,y轴由大到小的变化过程:图来解释,这个时候屏幕坐标肯定是比原来屏幕1,3坐标小,因为屏幕在往上滑
    2、屏幕的坐标图,向下滑动屏幕就是x轴不变,y轴由小到大的变化过程
    3、屏幕的坐标图,向左滑动屏幕就是y轴不变,x轴由大到小的变化过程
    4、屏幕的坐标图,向右滑动屏幕就是y轴不变,x轴由小到大的变化过程

    图的理解:当前屏幕的参数跟着当前滑动屏幕的参数走,在屏幕滑动时在屏幕上下选个参考物做讲解
    来区分上下滑

    size = driver.get_window_size()
    print(size)

    #获取屏幕的大小{'width': 720, 'height': 1280}
    源码如下:
    #defgetSize():获取机器屏幕大小
    #def

    swipeup(t):屏幕向上滑动,x1为x轴坐标,y1起始的y轴坐标,y2结束的y轴坐标
    # x1 =int(l[0] *0.5):l是上面函数中返回的屏幕大小,0和1其实是索引位,0代表x值,1代表y的值
    defgetSize():
    x = driver.get_window_size()['width']
    y = driver.get_window_size()['height']
    return(x, y)

    #屏幕向上滑动(代码里把注释去掉)
    defswipeup(t):
    l = getSize()
    x1 =int(l[0] *0.5)
    y1 =int(l[1] *0.75)
    y2 =int(l[1] *0.25)
    driver.swipe(x1, y1, x1, y2, t)
    sleep(6)
    swipeup(1000)

    #屏幕向下滑动
    defswipedown(t):
    l = getSize()
    x1 =int(l[0] *0.5)
    y1 =int(l[1] *0.25)
    y2 =int(l[1] *0.75)
    driver.swipe(x2, y1, x1, y1, t)
    sleep(6)
    swipedown(1000)

    #屏幕向左滑动
    def swipLeft(t):
        l=getSize()
        x1=int(l[0]*0.75)
        y1=int(l[1]*0.5)
        x2=int(l[0]*0.25)
        driver.swipe(x1,y1,x2,y1,t)
    #屏幕向右滑动
    def swipRight(t):
        l=getSize()
        x1=int(l[0]*0.25)
        y1=int(l[1]*0.5)
        x2=int(l[0]*0.75)
        driver.swipe(x2,y1,x1,y1,t)

    ===============================================================

    案例(1):模板百度阅读中,向左移动两次

    from appium import webdriver
    from bbbb.roll import *
    
    caps = {
        "platformName": "Android",
        "deviceName": "127.0.0.1:62001",
        "platformVersion": "4.4.w",
        "appPackage": "com.baidu.yuedu",
        "appActivity": "com.baidu.yuedu.splash.SplashActivity"
    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
    sleep(8)
    # 取消更新
    driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click()
    sleep(4)
    driver.find_element_by_id('com.baidu.yuedu:id/righttitle').click()   #点击图书
    sleep(8)
    #向右移动一次
    size = driver.get_window_size()
    x1 = size.get("width") * 0.9
    x2 = size.get("width") * 0.1
    y = size.get("height") * 0.5
    driver.swipe(x1, y, x2, y, duration=1000)
    
    #向右移动一次
    size = driver.get_window_size()
    x1 = size.get("width") * 0.9
    x2 = size.get("width") * 0.1
    y = size.get("height") * 0.5
    driver.swipe(x1, y, x2, y, duration=1000)
    

    ==============================================================

    案例(2):模板百度阅读中,封装在调用向上滑,向下滑,向左滑,向右滑

    写在两个模块中:

    aa模块:

    from appium import webdriver
    from bbbb.bb import *
    
    caps = {
        "platformName": "Android",
        "deviceName": "127.0.0.1:62001",
        "platformVersion": "4.4.w",
        "appPackage": "com.baidu.yuedu",
        "appActivity": "com.baidu.yuedu.splash.SplashActivity"
    }
    driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
    sleep(8)
    # 取消更新
    driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click()
    sleep(4)
    driver.find_element_by_id('com.baidu.yuedu:id/righttitle').click()   #点击图书
    sleep(8)
    
    rollUp(driver, 2)
    rollDown(driver, 2)
    rollLeft(driver, 3)
    rollRight(driver, 3)
    

    bb模块(封装滑动方法)

    from time import sleep
    
    # 左滑
    def rollLeft(driver, t=1):
        for i in range(t):
            size = driver.get_window_size()
            x1 = size.get("width") * 0.9
            x2 = size.get("width") * 0.1
            y = size.get("height") * 0.5
            driver.swipe(x1, y, x2, y, duration=1000)
            sleep(2)
    
    # 右滑
    def rollRight(driver, t=1):
        for i in range(t):
            size = driver.get_window_size()
            x1 = size.get("width") * 0.1
            x2 = size.get("width") * 0.9
            y = size.get("height") * 0.5
            driver.swipe(x1, y, x2, y, duration=1000)
            sleep(2)
    
    # 上滑
    def rollUp(driver, t=1):
        for i in range(t):
            size = driver.get_window_size()
            x = size.get("width") * 0.5
            y1 = size.get("height") * 0.9
            y2 = size.get("height") * 0.2
            driver.swipe(x, y1, x, y2, duration=1000)
            sleep(2)
    
    # 下滑
    def rollDown(driver, t=1):
        for i in range(t):
            size = driver.get_window_size()
            x = size.get("width") * 0.5
            y1 = size.get("height") * 0.2
            y2 = size.get("height") * 0.9
            driver.swipe(x, y1, x, y2, duration=1000)
            sleep(2)
    

    =================================================================================

    案例3:根据坐标定位

    tap是模拟手指点击页面元素

    语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位是毫秒

    缺点:

    tap方法:通过坐标定位是元素定位的下下下策,实在没办法才用这个,不同的手机分辨率不同,因此适用性不强,这个坐标就不能写死,得算出所在屏幕的比例。

    driver.tap([坐标],持续点击时间)

    [55,741][665,801]

    案例:百度阅读【取消按钮】

    坐标:bounds :[55,741][665,801]   #第一个坐标值可以定位到,第二个坐标值定位就报错,不超出长度;

    driver.tap(driver.tap([(55,741)],2)) #坐标x1,y1

    driver.tap(driver.tap([(55,741),(665,801)],500)) 

    错误写法:driver.tap(driver.tap(55,741)

     

    代码:

    ======================================================================

     tap详解:

    def __init__(self, driver):
    self.driver = driver
    # 获取屏幕的 size
    self.size = driver.get_window_size()
    # 获取屏幕宽度 width
    self.width = self.size['width']
    # 获取屏幕高度 height
    self.height = self.size['height']
    # 坐标定位、点击长按通用,调试机型屏幕分辩2280*1080,只适配全面屏、2K
    # 注意全面屏与有底部导航的分辨率不一样,要考虑Y轴的底部导航,[(x,y),z],z:持续时间
    def driverTap(self, x, y, z=None):
    self.driver.tap([((x / 1080) * self.width, (y / 2280) * self.height)], z)def __init__(self,driver):
    self.driver = driver
    # 获取屏幕的 size
    self.size = driver.get_window_size()
    # 获取屏幕宽度 width
    self.width = self.size['width']
    # 获取屏幕高度 height
    self.height = self.size['height']
    # 坐标定位、点击长按通用,调试机型屏幕分辩2280*1080,只适配全面屏、2K
    # 注意全面屏与有底部导航的分辨率不一样,要考虑Y轴的底部导航,[(x,y),z],z:持续时间
    def driverTap(self,x,y,z=None):
    self.driver.tap([((x/1080)*self.width,(y/2280)*self.height)],z)
    ======================================================================================
  • 相关阅读:
    postgres 错误duplicate key value violates unique constraint 解决方案
    Golang包管理工具之govendor的使用
    《算法竞赛进阶指南》0x26广搜变形 HDOJ3085 双向BFS
    《算法竞赛进阶指南》0x26广搜变形 POJ3635
    《算法竞赛进阶指南》0x26广搜变形 电路维修 01最短路问题
    《算法竞赛进阶指南》0x25广度优先搜索 推箱子游戏 双重BFS
    《算法竞赛进阶指南》0x25广度优先搜索 多源floodfill
    《算法竞赛进阶指南》0x25广度优先搜索 POJ3322 Bloxorz I
    NETCORE
    VUE- 异步等待方法嵌套
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/14213345.html
Copyright © 2020-2023  润新知