飞道的博客

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

353人阅读  评论(0)
  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("结束")
    
  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
    }
    

    用过开发者工具的看到下图应该知道该怎么弄了

  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("结束")
    
       

转载:https://blog.csdn.net/qq_51955445/article/details/127909237
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场