• Appium在小米11真机上进行微信自动化


    1. jdk、python、nodejs要准备好
      苦恼于配环境的同学可以尝试Aritest框架,我写了一篇博客供参考Airtest手机APP自动化操作微信

    2. 下载appium
      仓库地址 注意他不让自定义安装目录,直接装在C盘
      C:\Users\用户名\AppData\Local\Programs\Appium

    3. 下载python的包
      pip install Appium-Python-Client -i https://pypi.tuna.tsinghua.edu.cn/simple

    4. 下载android-sdk
      先下SDK Tools
      国内一个镜像网站
      参考这个教程
      在这里插入图片描述
      安装好后,运行这个SDK Manager.exe
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      然后install,同意协议,等待安装结束
      在这里插入图片描述

    5. 配置环境变量
      ANDROID_HOME值为刚刚安装的目录,如下图就是D:\IDEandEVR\Android SDK Tools
      在这里插入图片描述
      在这里插入图片描述
      然后在PATH中添加
      %ANDROID_HOME%\platform-tools
      %ANDROID_HOME%\tools
      在这里插入图片描述
      再配置下appium的ANDROID_HOME
      在这里插入图片描述

    6. 手机插上电脑,进入开发者模式
      MIUI进入开发者模式
      小米手机以开发者模式连上电脑
      先在上面那个appium界面点启动服务器
      使用adb devices进行测试,打印结果也是下面json里的deviceName数据
      在这里插入图片描述

    7. 写一段代码测试
      如果运行正常,真机上会打开微信的登录界面

      from appium import webdriver
      
      if __name__ == '__main__':
        desired_caps = {
          'platformName': 'Android',
          'deviceName': '99da881c',
          'platformVersion': '12',# 我直接用的手机上显示的Android版本,虽然我也不知道该用什么
          'appPackage': 'com.tencent.mm',
          'appActivity': 'com.tencent.mm.ui.LauncherUI',
          'automationName':'UIAutomator2',# 高版本android需要这个,好像是从11开始       
         }
      
        driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
        print("结束")
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    8. 开始找界面元素
      首先,不推荐uiautomatorviewer,即下图这个,因为jdk版本等问题,有需要改源码才能解决的BUG
      在这里插入图片描述
      我这里决定使用Appium自带的Appium Inspector
      在这里插入图片描述
      把python代码里的配置数据弄到这里,可以填表单,或者右边粘贴json,但是很容易说json语法错误,我也不知道为什么
      在这里插入图片描述
      新增的noReset是防止重置应用,避免需要反复登录

      {
        "platformName": "Android",
        "deviceName": "99da881c",
        "platformVersion": "12",
        "appPackage": "com.tencent.mm",
        "appActivity": "com.tencent.mm.ui.LauncherUI",
        "automationName": "UIAutomator2",
        "noReset": true
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      用过开发者工具的看到下图应该知道该怎么弄了
      在这里插入图片描述

    9. 注意事项
      appium是真的慢,找一个登录按钮找个20s,这里先放一个最基本的避坑思路
      2020年12月30日 appium 执行速度优化
      很多博客提出,对于固定位置的组件,直接用坐标点击,速度能快一半,但是如果不特殊处理,不能兼容不同屏幕大小的手机
      下面红圈的两个元组,表示这个组件左上角和右下角的定位,所以我们只要触摸(x1~ x2,y1 ~ y2)的就行了
      driver.tap([(200, 2800)], 500)
      在这里插入图片描述

    10. 中文API

    11. 应付学校作业写的一个监听手机微信当前屏幕内新消息并做出相应回应的代码

      import time
      import datetime
      
      from appium import webdriver
      from appium.webdriver.common.mobileby import MobileBy
      
      from appium.webdriver.common.touch_action import TouchAction
      
      
      def response(text):
         if text == "现在什么时候了":
             return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
         elif text == "感觉Appium怎么样":
             return "配环境有点小麻烦,运行时速度较慢,文档不太全面,感觉用的人不多,不太行"
         elif text == "你这个脚本的效果是什么":
             return "检测微信主页的可视范围内(不下滑时)的所有有未读信息的好友,判断他们的文本并进行回复"
         elif text == "你是谁":
             return "刘宇阳"
         elif text == "缺憾是什么":
             return "因为怕登录频繁出问题,就没写登录部分;不能回复所有好友的消息,因为框架只能检测屏幕可视范围的组件,可以实现下滑,但是会很麻烦;轮询,所以回复速度可能有点慢"
         elif text == "为什么能回复自己发的消息":
             return "因为左右两边的聊天框是同一类组件,区分起来有点麻烦;不区分也方便自己测试"
         else:
             return None
      
      
      if __name__ == '__main__':
         # Appium的配置
         desired_caps = {
             'platformName': 'Android',
             'deviceName': '自己用命令获得',
             'platformVersion': '12',
             'appPackage': 'com.tencent.mm',
             'appActivity': 'com.tencent.mm.ui.LauncherUI',
             'automationName': 'UIAutomator2',
             'noReset': True,  # 不要重置App,不需要重新登录
         }
         # 建立会话并打开微信界面
         driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
         try:
             while True:
                 print("监听中...")
                 time.sleep(3)
                 # 找红点
                 red_dots_tmp = driver.find_elements(MobileBy.ID, "com.tencent.mm:id/kmv")
                 red_dots = []
                 # 遍历每个出现红点的消息(未读新消息)
                 for dot in red_dots_tmp:
                 	   # 模拟屏幕触摸
                     TouchAction(driver).tap(dot).perform()
                     time.sleep(1)
                     # 获得当前屏幕内的所有消息
                     msg_tmp = driver.find_elements(MobileBy.ID, "com.tencent.mm:id/b4b")
                     # 获得最新的消息
                     text = msg_tmp[len(msg_tmp) - 1].text
                     # 获取回复文本
                     resp = response(text)
                     if resp != None:
                         # 点击输入框
                         text_input = driver.find_element(MobileBy.ID, "com.tencent.mm:id/b4a")
                         TouchAction(driver).tap(text_input).perform()
                         # 放入文本
                         text_input.set_text(resp)
                         # 发送
                         send_btn = driver.find_element(MobileBy.ID, "com.tencent.mm:id/b8k")
                         TouchAction(driver).tap(send_btn).perform()
                     # 返回到主页
                     back_btn = driver.find_element(MobileBy.ID, "com.tencent.mm:id/yn")
                     TouchAction(driver).tap(back_btn).perform()
         except:
             print("结束")
      
      • 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
      • 64
      • 65
      • 66
      • 67
      • 68
      • 69
      • 70
      • 71

      在这里插入图片描述

  • 相关阅读:
    【实战:python-Django发送邮件-短信-钉钉通知】
    红色罗丹明标记修饰牛血清白蛋白;RBITC-Bovine Serum Albumin(BSA)
    066:vue+openlayers画各种图形并获取feature信息( 示例代码 )
    1. JS 和 Jquery 获取元素对象 `$()`
    Java进阶导图xmind版本
    云安全防护总体架构设计
    metricbeat监控logstash运行状态上报Elasticsearch后Kibana可视化查看
    python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
    智慧工地大数据管理,真是细节到极致了
    洛谷 P2870 [USACO07DEC]Best Cow Line G(后缀数组)
  • 原文地址:https://blog.csdn.net/qq_51955445/article/details/127909237