• python 移动测试之Appium环境搭建及简单应用


    移动测试

    1.移动测试介绍

    • 定义

      测试手机程序

    • 测试内容

      • 功能测试:查看功能是否正常
      • 安装卸载测试
      • 升级测试
      • 兼容性测试
        • Android系统版本
        • 厂商二次开发版本
        • 不同的分辨率
        • 不同的网络
      • 网络切换、中断测试
      • 使用中来电话、短信
      • 横竖屏切换
      • 健壮性:耗电量、流量消耗、崩溃回复

    2.环境搭建

    • java sdk

      • 安装jdk
      • 配置JAVA_HOME和PATH
        在这里插入图片描述
    • Android SDK:

    • 虚拟机安装

      • 下载夜神模拟器

        默认安装到C盘,安装好后可以将整个文件夹剪切到D:\software\app_test目录下,这样便于管理。需要将夜神模拟器中的adb.exe和nox_adb.exe用platform-tools目录下的adb.exe替换。
        在这里插入图片描述

        • 直接用platform-tools文件夹里面的adb.exe替换adb.exe
        • 将platform-tools目录下的adb.exe复制到桌面,重命名为nox_adb.exe,替换夜神模拟器文件夹bin目录中的nox_adb.exe
    • 下载并安装Appium

    在这里插入图片描述
    在这里插入图片描述

    3.adb的使用

    • 定义:db的全称为Android Debug Bridge,就是起到调试桥的作用。既包含ADB服务,也包含了与服务对应的Client。ADB是一个Server-Client程序,其中客户端是用来操作的电脑,服务端是android设备。

    • adb是android sdk里的一个工具,可以用来直接操作管理android模拟器或真实的android设备,它的主要功能有:

    • 运行设备的shell(命令行)

    • 管理模拟器或设备的端口映射

    • 计算机和设备之间的文件传输

    • 将本地apk软件安装至模拟器或android设备

    • 常用命令

      • 关闭及开启服务
      adb kill-server
        
      adb start-server
      
      • 1
      • 2
      • 3
      • 查看设备
      adb devices
      
      • 1

      在这里插入图片描述

      • 进入手机终端
       adb shell
      
      • 1

      在这里插入图片描述

      • 获取信息
      adb shell getprop ro.build.version.release  获取手机android版本
      
      adb shell dumpsys window windows | findstr mFocusedApp 获取手机当前运行的程序和界面的名称
      
      • 1
      • 2
      • 3

      在这里插入图片描述
      在这里插入图片描述

      • 文件传输
      adb push 电脑上的文件 手机上的位置
      
      adb pull 手机上的文件 电脑上的位置
      
      • 1
      • 2
      • 3
      • 软件安装卸载
      adb install 电脑上的apk文件路径 安装应用
      
      adb uninstall 应用的包名
      
      • 1
      • 2
      • 3
      • 获取其他信息
      adb shell am start -W 包名/.启动名
      
      • 1
       adb shell am start -W com.android.settings/.Settings
      
      • 1

      在这里插入图片描述
      运行上面这条命令,会打开设置页面。
      在这里插入图片描述

    4.入门案例

    """
    入门案例
    1.自动化测试工具
    选取Appium---支持的语言多、支持的平台多
    坏境搭建:
        1.安装appium的程序
        2.在puthon中安装Appium-Python-Client
        pip install Appium-Python-Client
    """
    
    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    
    from appium import webdriver
    
    # server 启动参数
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    # driver.xxx
    # element = driver.find_element_by_xx()
    # element.xxx
    # 打开设置页面,5秒后关闭
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    在这里插入图片描述

    5.基础操作

    • 基础API

      • driver
        • close_app()–>关闭打开的应用
        • quit()–>断开连接
        • install_app(‘apk在电脑的绝对路径’)–>安装应用
        • remove_app(‘应用的包名’)–>卸载应用
        • is_app_installed(‘应用的包名’)–>判断应用是否安装
        • push_file(目标位置,base64编码的内容)
        • pull_file(来源位置)–>返回值是base64编码的内容
        • page_source–>获取界面xml源码
        • find_element()–>可根据ID/NAME/CLASS_NAME/CSS_SELECTOR/TAG_NAME等查找元素
        • find_elements()–>可根据ID/NAME/CLASS_NAME/CSS_SELECTOR/TAG_NAME等查找元素
        • current_package–>获取当前操作的应用的包名
        • current_activity–>获取当前操作的界面的名称
      • element
        • text–>获取元素文本内容
        • click()–>点击元素对应位置
        • get_attribute(属性名称)–>获取属性值

      基础操作之app安装与卸载:

      # 1.连接设备
      # 组装一个字典,注明平台、系统版本、名称
      # 注明要打开的应用和界面的名称
      import time
      
      from appium import webdriver
      
      # server 启动参数
      desired_caps = {}
      # 1.安卓系统
      desired_caps['platformName'] = 'Android'
      # 2.系统的版本号
      desired_caps['platformVersion'] = '7.1'
      # 3.手机名称,可通过命令:adb devices获取
      desired_caps['deviceName'] = '127.0.0.1:62001'
      
      # 从appium库里面导入driver对象
      # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
      driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
      # 2.执行操作
      # 安装app应用,如哔哩哔哩(32位),apk路径使用绝对路径
      # driver.install_app('D:\\software\\iBiliPlayer-bili.apk')
      # 打开哔哩哔哩,获取应用信息--包名等
      # adb shell dumpsys window windows | findstr mFocusedApp
      #   mFocusedApp=AppWindowToken{5787627 token=Token{8867341 ActivityRecord{d48ca28 u0 tv.danmaku.bili/.MainActivityV2 t18}}}
      # app卸载
      # driver.remove_app('tv.danmaku.bili')
      # 判断应用是否已安装
      if driver.is_app_installed('tv.danmaku.bili'):
          # 存在则卸载应用
          driver.remove_app('tv.danmaku.bili')
      else:
          # 不存在则安装
          driver.install_app('D:\\software\\iBiliPlayer-bili.apk')
      time.sleep(5)
      # 3.退出
      # 退出app包
      driver.close_app()
      # 关闭连接对象
      driver.quit()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    • 输入文本
      对于某些元素,可以接收文本输入。
      • send_keys(文本内容)
        可以输入文字,但对于中文,在连接设备时,要加上配置:

         desired_caps['unicodeKeyboard'] = True # unicode设置(允许中文输入)
         desired_caps['resetKeyboard'] = True # 键盘设置(允许中文输入)
        
        • 1
        • 2

        如果对于同一个元素,多次调用此方法,会先逐个删除原有内容,再输入。

      • clear():清空文本框中的内容

      # 1.连接设备
      # 组装一个字典,注明平台、系统版本、名称
      # 注明要打开的应用和界面的名称
      import time
      
      from appium import webdriver
      
      # server 启动参数
      from appium.webdriver.common.appiumby import AppiumBy
      
      desired_caps = {}
      # 1.安卓系统
      desired_caps['platformName'] = 'Android'
      # 2.系统的版本号
      desired_caps['platformVersion'] = '7.1'
      # 3.手机名称,可通过命令:adb devices获取
      desired_caps['deviceName'] = '127.0.0.1:62001'
      # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
      # 获取手机当前运行的程序和界面的名称
      # adb shell dumpsys window windows | findstr mFocusedApp
      desired_caps['appPackage'] = 'com.android.settings'
      # 5.当前app里面的界面内容
      desired_caps['appActivity'] = '.Settings'
      desired_caps['unicodeKeyboard'] = True  # unicode设置(允许中文输入)
      desired_caps['resetKeyboard'] = True  # 键盘设置(允许中文输入
      
      # 从appium库里面导入driver对象
      # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
      driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
      # 2.执行操作
      # with open("aaa.xml", "w", encoding="utf-8") as f:
      #     # page_source 获取界面xml源码
      #     f.write(driver.page_source)
      
      # 点击操作
      time.sleep(2)
      # driver.find_element_by_xpath("//android.widget.TextView[@resource-id='com.android.settings:id/search']").click()
      # AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
      # https://ask.csdn.net/questions/7752813
      # 根据xpath查找元素,并点击
      # driver.find_element(by=AppiumBy.XPATH, value="//android.widget.TextView[@resource-id='com.android.settings:id/search']").click()
      driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='com.android.settings:id/search']").click()
      time.sleep(2)
      driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").send_keys('WLAN')
      time.sleep(2)
      # 清空文本框中的内容
      driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").clear()
      time.sleep(2)
      driver.find_element(by=AppiumBy.XPATH, value="//*[@resource-id='android:id/search_src_text']").send_keys('显示')
      
      # 使用文本定位
      # 打开设置,点击“显示”
      # 使用文本定位
      # driver.find_element(by=AppiumBy.XPATH, value="//*[@text='显示']").click()
      
      # 打开设置页面,5秒后关闭
      time.sleep(5)
      # 3.退出
      # 退出app包
      driver.close_app()
      # 关闭连接对象
      driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6.模拟手势

    6.1安卓内在机制

    • 对于目前不需要在屏幕中显示的内容,为节省硬件资源,不进行处理;
    • 使用栈的方式管理界面;
    • 页面滑动有“惯性”机制,会根据按下、抬起的位置以及总的时间,滚动不一样的距离。

    6.2滚动

    swipe(self, start_x: int, start_y: int, end_x: int, end_y: int, duration: int=0)
    
    • 1
    • duration默认是600(单位为毫秒),它会影响实际滚动的距离
    • click()方法,实际上点击的是元素所在的位置。经过滑动后,位置可能发生了变化,导致点不准。需要调用一下sleep()方法,等滑动结束之后,再进行点击操作。
    • 使用uiautomatorviewer.bat获取鼠标定位。
      在这里插入图片描述

    双击运行,点击如下图所示的按钮,就可以将模拟器的当前界面截屏。
    在这里插入图片描述

    用鼠标在界面截图上移动,右边会显示追踪到的鼠标的大概位置。
    在这里插入图片描述
    切换到设置页面,再进行界面截屏。将鼠标移动到目标元素,即可查看坐标等信息。
    在这里插入图片描述

    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    
    from appium import webdriver
    
    # server 启动参数
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    # 添加滚动操作
    # driver.swipe(start_x=270, start_y=720, end_x=270, end_y=240)
    # driver.swipe(start_x=270, start_y=720, end_x=270, end_y=100)
    driver.swipe(start_x=300, start_y=2400, end_x=300, end_y=1400)
    
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    scroll(origin_el, destination_el, duration)
    
    • 1
    • scroll 直接传递元素作为参数即可,不需要手动获取位置
    • scroll 底层实现–>与swipe有一些区别,没有中间的采样点,只有初始、介绍,但最终的效果和swipe是一样的
    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    
    from appium import webdriver
    
    # server 启动参数
    from appium.webdriver.common.appiumby import AppiumBy
    
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    desired_caps['automationName'] = 'uiautomator2'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    # 添加滚动操作
    # 定位元素(标签)
    el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='更换壁纸']")
    print(el1)
    el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='显示']")
    print(el2)
    # scroll(origin_el, destination_el, duration)
    driver.scroll(el2, el1, duration=600)
    time.sleep(3)
    driver.find_element(by=AppiumBy.XPATH, value="//*[@text='声音']").click()
    
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    在这里插入图片描述

    6.3拖拽

    在安卓中,拖拽=按下 等待一定时间–>移动–>松手

    drag_and_drop(origin_el, destination_el)
    
    • 1

    6.4 TouchAction

    • 作用:
      构建相对比较复杂的,连续的触摸行为
    • 用法
      • 创建TouchAction对象,需要把driver作为参数传递
      • 通过各种方法添加动作
      • 执行操作 perform()
    • 方法
      • 按下
      press(self, el, x, y, pressure)
      """
      如果传递了el参数,x,y可以不传;
      如果el为None,则需要传递x,y;
      pressure是ios专用的
      """
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 长按
      long_press(self, el, x, y, duration=1000)
      """
      如果传递了el参数,x,y可以不传;
      如果el为None,则需要传递x,y
      """
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 移动
      move_to(self, el, x, y)
      """
      如果传递了el参数,x,y可以不传;
      如果el为None,则需要传递x,y
      """
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 等待
      wait(self, ms)  # ms:等待时间,单位为毫秒
      
      • 1
      • 松手
      release()
      
      • 1
      • 轻敲(点击)
      tap(self, element, x, y, count=1)
      """
      tap和click的区别:
          click有延迟触发效果(为了校验是不是双击)
          通过tap(el,count=2)可以模拟双击
      """
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from appium.webdriver.common.touch_action import TouchAction
    
    # server 启动参数
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='通知']")
    el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='WLAN']")
    # 实例化一个动作类对象
    # 创建TouchAction对象,需要把driver作为参数传递
    action = TouchAction(driver)
    
    # press 可以通过标签(元素)定位,也可以使用坐标x,y
    # action.press(el1).wait(300).move_to(el2)
    # 长按
    # action.long_press(el1)
    # 轻敲
    action.tap(el2)
    
    # 松开按键(松手)
    action.release()
    # 执行操作
    action.perform()
    
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    7.综合案例

    • 设置”Z“字型图形密码
    • 绘制解锁图案的过程,是连续触摸的过程,使用 TouchAction动作类实现。最主要的步骤是获取图案涉及到的几个点的位置。可以用D:\software\app_test\tools目录下的uiautomatorviewer.bat进行截屏捕捉。
      在这里插入图片描述
    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from appium.webdriver.common.touch_action import TouchAction
    
    # server 启动参数
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    el1 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='通知']")
    el2 = driver.find_element(by=AppiumBy.XPATH, value="//*[@text='WLAN']")
    
    # 创建TouchAction对象,需要把driver作为参数传递
    action = TouchAction(driver)
    action.press(el1).wait(300).move_to(el2)
    action.release()
    # 事件进行提交
    action.perform()
    time.sleep(2)
    # 点击“安全”
    driver.find_element(by=AppiumBy.XPATH, value="//*[@text='安全']").click()
    time.sleep(2)
    # 点击“屏幕锁定”
    driver.find_element(by=AppiumBy.XPATH, value="//*[@text='屏幕锁定']").click()
    time.sleep(2)
    # 点击“图案”
    driver.find_element(by=AppiumBy.XPATH, value="//*[@text='图案']").click()
    time.sleep(2)
    # x=180,770 x=449, x=702
    # x=182,1037
    # x=180,1314
    # 设置图案--“Z”字型
    action.press(x=180, y=770).wait(200).move_to(x=449, y=770).wait(200).move_to(x=702, y=770)\
                              .wait(200).move_to(x=449, y=1037).wait(200).move_to(x=180, y=1314)\
                              .wait(200).move_to(x=449, y=1314).wait(200).move_to(x=702, y=1314)
    action.release()
    action.perform()
    
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    在这里插入图片描述

    8.其他操作

    • .device_time:获取手机时间

    • .get_window_size():获取屏幕大小

    • .network_connection:获取手机网络信息

      • 1–飞行模式;2–wifi;4.移动数据 6=2+4
        在这里插入图片描述
    • .set_network_connection(网络模式数字):设置手机网络信息

    • .keyevent(按键数字):点击按键

    • get_screenshot_as_file/save_screenshot(图片路径):截屏

    • .open_notifications():打开通知栏

    # 1.连接设备
    # 组装一个字典,注明平台、系统版本、名称
    # 注明要打开的应用和界面的名称
    import time
    
    from appium import webdriver
    
    # server 启动参数
    desired_caps = {}
    # 1.安卓系统
    desired_caps['platformName'] = 'Android'
    # 2.系统的版本号
    desired_caps['platformVersion'] = '7.1'
    # 3.手机名称,可通过命令:adb devices获取
    desired_caps['deviceName'] = '127.0.0.1:62001'
    # 4.应用程序的包名,也是app的包名,在手机中,包名是app的唯一标识
    # 获取手机当前运行的程序和界面的名称
    # adb shell dumpsys window windows | findstr mFocusedApp
    desired_caps['appPackage'] = 'com.android.settings'
    # 5.当前app里面的界面内容
    desired_caps['appActivity'] = '.Settings'
    
    # 从appium库里面导入driver对象
    # driver = webdriver.Remomte('appium程序的地址','一个字典,要获取设置的要求')
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    # 2.执行操作
    # 获取当前时间
    device_time = driver.device_time
    print(device_time)
    # 获取当前界面大小
    window_size = driver.get_window_size()
    print(window_size)
    # 获取手机网络信息
    # 1--飞行模式;2--wifi;4.移动数据 6=2+4
    network_info = driver.network_connection
    print(network_info)
    
    # 截屏
    """
    get_screenshot_as_file():将当前窗口的截屏保存为png图片,文件名使用绝对路径
    get_screenshot_as_png():获取当前窗口截屏的二进制数据
    get_screenshot_as_base64():获取截屏的base64编码数据,常用于在HTML中的嵌入图像
    save_screenshot():将当前窗口的屏幕截图保存为PNG图像文件。如果存在任何IOError,则返回False,否则返回True。在文件名中使用完整路径。
    """
    # 将当前窗口的截屏保存为png图片,文件名使用绝对路径
    driver.get_screenshot_as_file('设置界面.png')
    # 打开通知栏
    driver.open_notifications()
    time.sleep(5)
    # 3.退出
    # 退出app包
    driver.close_app()
    # 关闭连接对象
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述


    参考文章:

  • 相关阅读:
    layui增删改查
    哈夫曼编码与二叉字典树
    学习在php中将特大数字转成带有千/万/亿为单位的字符串
    嵌入式面试题
    【TensorFlow深度学习】使用TensorBoard可视化模型训练过程与性能指标
    k8s、helm删除不掉资源问题处理
    【设计模式】 - 结构型模式 - 适配器模式
    小啊呜产品读书笔记001:《邱岳的产品手记-13》第24讲 产品案例分析:PathSource的混乱与直观 & 25讲 产品世界的暗黑模式:操纵的诱惑
    『Halcon与C#混合编程』001_环境搭建
    Systemd Rsync 文件定时同步
  • 原文地址:https://blog.csdn.net/username666/article/details/126215208