zoukankan      html  css  js  c++  java
  • Python Appium 滑动、点击等操作

    Python Appium 滑动、点击等操作

    1、手机滑动-swipe

    # FileName : Tmall_App.py
    # Author   : Adil
    # DateTime : 2018/3/25 17:22
    # SoftWare : PyCharm
    
    from appium import  webdriver
    
    caps = {}
    
    caps['platformName'] = 'Android'
    caps['platformVersion'] = '6.0'
    caps['deviceName'] = 'N79SIV5PVCSODAQC'
    caps['appPackage'] = 'com.tmall.wireless'
    caps['appActivity'] = 'com.tmall.wireless.splash.TMSplashActivity'
    #隐藏键盘
    caps['unicodeKeyboard'] = True
    caps['resetKeyboard'] = True
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    driver.swipe()
    if __name__ == '__main__':
    
        pass

    查看源码

    Ctrl + 鼠标右键点击 driver.swipe()

    # convenience method added to Appium (NOT Selenium 3)
        def swipe(self, start_x, start_y, end_x, end_y, duration=None):
            """Swipe from one point to another point, for an optional duration.
    
            :Args:
             - start_x - x-coordinate at which to start
             - start_y - y-coordinate at which to start
             - end_x - x-coordinate at which to stop
             - end_y - y-coordinate at which to stop
             - duration - (optional) time to take the swipe, in ms.
    
            :Usage:
                driver.swipe(100, 100, 100, 400)
            """
            # `swipe` is something like press-wait-move_to-release, which the server
            # will translate into the correct action
            action = TouchAction(self)
            action 
                .press(x=start_x, y=start_y) 
                .wait(ms=duration) 
                .move_to(x=end_x, y=end_y) 
                .release()
            action.perform()
            return self

    查看源码语法,起点和终点四个坐标参数。 手机屏幕从左上角开始为0,向右为x轴坐标,向下为y轴坐标。 

    duration是滑动屏幕持续的时间,时间越短速度越快。默认为None可不填,一般设置500-1000毫秒比较合适。

    swipe(self, start_x, start_y, end_x, end_y, duration=None) 
        Swipe from one point to another point, for an optional duration.
        从一个点滑动到另外一个点,duration是持续时间
            
        :Args:
        - start_x - 开始滑动的x坐标
        - start_y - 开始滑动的y坐标
        - end_x - 结束点x坐标
        - end_y - 结束点y坐标
        - duration - 持续时间,单位毫秒
        
        :Usage:
        driver.swipe(100, 100, 100, 400)

    向下滑动实例

    # FileName : Tmall_App.py
    # Author   : Adil
    # DateTime : 2018/3/25 17:22
    # SoftWare : PyCharm
    import time
    from appium import  webdriver
    
    caps = {}
    
    caps['platformName'] = 'Android'
    caps['platformVersion'] = '6.0'
    caps['deviceName'] = 'N79SIV5PVCSODAQC'
    caps['appPackage'] = 'com.tmall.wireless'
    caps['appActivity'] = 'com.tmall.wireless.splash.TMSplashActivity'
    #隐藏键盘
    caps['unicodeKeyboard'] = True
    caps['resetKeyboard'] = True
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    # 获取屏幕的size
    size = driver.get_window_size()
    print(size)
    # 获取屏幕宽度 width
    width = size['width']
    print(width)
    # 获取屏幕高度 height
    height = size['height']
    print(height)
    
    # 执行滑屏操作,向下(下拉)滑动
    x1 = width*0.5
    y1 = height*0.25
    y2 = height*0.9
    time.sleep(3)
    print("滑动前")
    driver.swipe(x1,y1,x1,y2)
    print("滑动后")
    # 增加滑动次数,滑动效果不明显,增加滑动次数
    
    for i in range(5):
        print("第%d次滑屏"%i)
        time.sleep(3)
        driver.swipe(x1,y1,x1,y2)
    time.sleep(3)
    
    driver.quit()
    
    
    
    if __name__ == '__main__':
    
        pass

    封装滑动方法,代码如下:

    # FileName : Tmall_App.py
    # Author   : Adil
    # DateTime : 2018/3/25 17:22
    # SoftWare : PyCharm
    import time
    from appium import  webdriver
    
    caps = {}
    
    caps['platformName'] = 'Android'
    caps['platformVersion'] = '6.0'
    caps['deviceName'] = 'N79SIV5PVCSODAQC'
    caps['appPackage'] = 'com.tmall.wireless'
    caps['appActivity'] = 'com.tmall.wireless.splash.TMSplashActivity'
    #隐藏键盘
    caps['unicodeKeyboard'] = True
    caps['resetKeyboard'] = True
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    # 获取屏幕的size
    size = driver.get_window_size()
    print(size)
    # 获取屏幕宽度 width
    width = size['width']
    print(width)
    # 获取屏幕高度 height
    height = size['height']
    print(height)
    
    # 执行滑屏操作,向下(下拉)滑动
    x1 = width*0.5
    y1 = height*0.25
    y2 = height*0.8
    time.sleep(3)
    print("滑动前")
    driver.swipe(x1,y1,x1,y2)
    print("滑动后")
    # 增加滑动次数,滑动效果不明显,增加滑动次数
    
    for i in range(5):
        print("第%d次滑屏"%i)
        time.sleep(3)
        driver.swipe(x1,y1,x1,y2)
    time.sleep(3)
    
    # 封装滑动方法
    
    def swipeUp(driver,n = 5):
        '''定义向上滑动方法'''
        print("定义向上滑动方法")
        x1 = width*0.5
        y1 = height*0.9
        y2 = height*0.25
        time.sleep(3)
        print("滑动前")
        for i in range(n):
            print("第%d次滑屏" % i)
            time.sleep(3)
            driver.swipe(x1, y1, x1, y2)
    
    
    def swipeDown(driver,n = 5):
        '''定义向下滑动方法'''
        print("定义向下滑动方法")
        x1 = width*0.5
        y1 = height*0.25
        y2 = height*0.9
        time.sleep(3)
        print("滑动前")
        for i in range(n):
            print("第%d次滑屏" % i)
            time.sleep(3)
            driver.swipe(x1, y1, x1, y2)
    
    def swipeLeft(driver,n = 5):
        '''定义向左滑动方法'''
        print("定义向左滑动方法")
        x1 = width*0.8
        x2 = width*0.2
        y1 = height*0.5
    
        time.sleep(3)
        print("滑动前")
        for i in range(n):
            print("第%d次滑屏" % i)
            time.sleep(3)
            driver.swipe(x1, y1, x2, y1)
    
    def swipeRight(driver,n = 5):
        '''定义向右滑动方法'''
        print("定义向右滑动方法")
        x1 = width*0.2
        x2 = width*0.8
        y1 = height*0.5
    
        time.sleep(3)
        print("滑动前")
        for i in range(n):
            print("第%d次滑屏" % i)
            time.sleep(3)
            driver.swipe(x1, y1, x2, y1)
    
    if __name__ == '__main__':
    
        swipeUp(driver)
        swipeDown(driver)
        swipeLeft(driver)
        swipeRight(driver)
    
        driver.quit()

    2、点击手机屏幕坐标-tap

     使用场景:有时候定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问)
    那就拿出绝招:点元素所在位置的坐标

    import time
    from appium import  webdriver
    
    caps = {}
    
    caps['platformName'] = 'Android'
    caps['platformVersion'] = '6.0'
    caps['deviceName'] = 'N79SIV5PVCSODAQC'
    caps['appPackage'] = 'com.tmall.wireless'
    caps['appActivity'] = 'com.tmall.wireless.splash.TMSplashActivity'
    #隐藏键盘
    caps['unicodeKeyboard'] = True
    caps['resetKeyboard'] = True
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    driver.tap()

    查看源码

    Ctrl + 鼠标右键点击 driver.tap()

    # convenience method added to Appium (NOT Selenium 3)
        def tap(self, positions, duration=None):
            """Taps on an particular place with up to five fingers, holding for a
            certain time
    
            :Args:
             - positions - an array of tuples representing the x/y coordinates of
             the fingers to tap. Length can be up to five.
             - duration - (optional) length of time to tap, in ms
    
            :Usage:
                driver.tap([(100, 20), (100, 60), (100, 100)], 500)
            """
            if len(positions) == 1:
                action = TouchAction(self)
                x = positions[0][0]
                y = positions[0][1]
                if duration:
                    action.long_press(x=x, y=y, duration=duration).release()
                else:
                    action.tap(x=x, y=y)
                action.perform()
            else:
                ma = MultiAction(self)
                for position in positions:
                    x = position[0]
                    y = position[1]
                    action = TouchAction(self)
                    if duration:
                        action.long_press(x=x, y=y, duration=duration).release()
                    else:
                        action.press(x=x, y=y).release()
                    ma.add(action)
    
                ma.perform()
            return self

    tap是模拟手指点击,一般页面上元素
    的语法有两个参数,第一个是positions,是list类型最多五个点,duration是持续时间,单位毫秒

    tap(self, positions, duration=None):
    
        Taps on an particular place with up to five fingers, holding for a certain time
        
        模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
        
        :Args:
        
        - positions - list类型,里面对象是元组,最多五个。如:[(100, 20), (100, 60)]
        
        - duration - 持续时间,单位毫秒,如:500
        
        :Usage:
        
        driver.tap([(100, 20), (100, 60), (100, 100)], 500)

    实际应用:坐标定位

    如图:查看元素坐标,可以看到右侧bonds属性

    代码实例如下:

    # FileName : Tamll_App_TapDemo.py
    # Author   : Adil
    # DateTime : 2018/3/26 17:44
    # SoftWare : PyCharm
    
    import time
    from appium import  webdriver
    
    caps = {}
    
    caps['platformName'] = 'Android'
    caps['platformVersion'] = '6.0'
    caps['deviceName'] = 'N79SIV5PVCSODAQC'
    caps['appPackage'] = 'com.tmall.wireless'
    caps['appActivity'] = 'com.tmall.wireless.splash.TMSplashActivity'
    #隐藏键盘
    caps['unicodeKeyboard'] = True
    caps['resetKeyboard'] = True
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
    
    
    # 操作元素坐标点击
    # 天猫-天猫超市 坐标
    def tapHit(driver):
        time.sleep(3)
        driver.tap([(234,324),(438,561)],500)
        time.sleep(2)
    
    
    if __name__ == '__main__':
        tapHit(driver)
    
        time.sleep(15)
        driver.quit()

    操作效果如下:

    说明:

     通过坐标定位是元素定位的下下下策,实在没办法才用这个,另外如果换了手机分辨率,这个坐标就不能写死了,得算出所在屏幕的比例。

  • 相关阅读:
    nyoj163 Phone List
    hdu1251统计难题
    hdu1754 I Hate It
    nyoj123 士兵杀敌(四)
    poj3468 A Simple Problem with Integers
    zoj1610 Count the Colors
    nyoj144 小珂的苦恼
    nyoj93 汉诺塔(三)
    poj2182 Lost Cows
    ASP.NET2.0中的Callback机制
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/8651365.html
Copyright © 2011-2022 走看看