github: https://github.com/openatx/uiautomator2

[安装]

  1. pip3 install -U uiautomator2

    # 安装UI Inspector --> 便于查找元素(浏览器打开 https://uiauto.dev 查看当前设备的界面结构)
  1. pip install uiautodev
    # 启动服务
  1. uiauto.dev
  1.  

[使用]

  1. import uiautomator2 as u2
  2.  
  3. d = u2.connect() # connect to device
  4. print(d.info)

    # 使用设备序列号连接(使用adb devices查看)
  1. d = u2.connect('123456f') # alias for u2.connect_usb('123456f')

    # 可以指定环境变量
  1. # export ANDROID_SERIAL=123456f
  1. # 使用WiFi的方式连接(adb使用wifi连接设备:https://www.cnblogs.com/lihongtaoya/p/17553171.html)
  1. d = u2.connect("ip:proxy") # wifi连接设备


元素定位页面:

常用方法:

  1. 常用定位方式:
  2. ResourceId定位:
  3. d(resourceId="com.meizu.mzbbs:id/tp").click()
  4.  
  5. Text定位:(很有用)
  6. d(text="精选").click()
  7.  
  8. Description定位:
  9. d(description="..").click()
  10.  
  11. ClassName定位:
  12. d(className="android.widget.TextView").click()

    支持组合定位: 同时指定classNametext
    d(className="android.widget.TextView", text=u"好友动态")
    使用xpath定位:
    d.xpath('//*[@resource-id="com.tencent.mobileqq:id/ivTitleBtnRightImage"]')
    使用相邻节点定位:
    d(text="小窝").sibling(resourceId="com.tencent.mobileqq:id/yx").click()

1.点击

  1. # click点击
  2. d(description="点按两次并按住可长按进入多选模式").click() # 也可更加某点就行点击d.click(0.1,0.1)
  3. # 单击直到元素消失,点击间隔1s,maxretry超时时长
  4. d(description="点按两次并按住可长按进入多选模式").click_gone(maxretry=5, interval=1)

2.长按

  1. # 长按long_click
  2. d(description="点按两次并按住可长按进入多选模式").long_click()

3.文本

  1. # 文本
  2. d.send_keys("1234") # 光标停留在输入框后直接sendkeys,自动切换fastinputime输入法
  3. d.clear_text() # 光标停留在输入框清空内容

4.拖拽

1)元素到元素拖拽

  1. # 元素到元素拖拽drag_to
  2. d(text="SecoClient").drag_to(text="哔哩哔哩", duration=0.25) # 将元素SecoClient拖到”哔哩哔哩“的位置,时间0.25s

2)元素到坐标拖拽

  1. # 元素到坐标的拖拽 drag_to
  2. d(text="SecoClient").drag_to(0.603, 0.587, duration=0.25)

3)坐标到坐标拖拽

  1. # 两个坐标之间拖拽drag
  2. d.drag(x1,y1,x2,y2)

5.滑动

1)元素滚动

  1. # 元素滑动"left", "right", "up", "down" 左右上下,一个步长5ms,20个step是100ms
  2. d(text="SecoClient").swipe("up", steps=20) # 将元素向上拖拽,时长100ms

2)屏幕滚动

  1. # 屏幕滑动
  2. x, y = d.window_size() # 获取屏幕分辨率
  3. x1 = x * 0.1
  4. y1 = y * 0.3
  5. y2 = y * 0.6
  6. d.swipe(x1, y1, x1, y2) # 手势向下滑,从竖屏30%的地方滑到60%的位置
  7. d.swipe(x*0.9, y*0.1, x*0.1, y*0.1) # 向右滑,从横屏90%的地方滑到10%的位置

也可直接操作滑动

  1. # 直接滑动 "left", "right", "up", "down" 左右上下
  2. d.swipe_ext("left")

3)界面滚动

滚动类型:horiz 为水平 vert 为垂直

滚动方向:forward 向前 , backward 向后 , toBeginning 滚动至开始 , toEnd 滚动至最后 ,to 滚动直接某个元素出现

  1. # 界面滚动(界面是否可以滚动) 不太好用
  2. d(scrollable=True).scroll.vert.toBeginning() # 垂直滚动到页面顶部(不填vert,默认就是垂直)
  3. d(scrollable=True).scroll.vert.toEnd() # 垂直滚动到页面底部
  4. d(scrollable=True).scroll.horiz.toEnd() # 水平滚动置末尾,即最右侧
  5. d(scrollable=True).scroll.horiz.toBeginning() # 水平滚动置开头,即最左侧
  6. d(scrollable=True).scroll.horiz.forward() # 水平向前滚动一下
  7. d(scrollable=True).scroll.horiz.backward() # 水平向后滚动一下
  8. d(scrollable=True).scroll.vert.forward() # 垂直向下滚动一下
  9. d(scrollable=True).scroll.vert.backward() # 垂直向上滚动一下

滚动置某一个元素停下来

  1. # 滚动置某个元素停下
  2. d(scrollable=True).scroll.vert.backward.to(resourceId="id/title", text="《系列》电影") # 水平向上滚动到指定元素停下,向上找不到元素会往下滚动
  3. d(scrollable=True).scroll.vert.toBeginning.to(text="SDK") # 垂直向上到指定元素停下,向上到顶部找不到元素会往下滚动

4)连续滚动

d.touch.down(x,y)   按住某个点

d.touch.sleep(5)   停留5s

d.touch.move(x,y)   移动到某点

d.touch.up(x,y)  在某点松开

  1. # 连续滑动 touch(手机图案解锁)
  2. d.touch.down(0.841, 0.477).sleep(3).up(0.841, 0.477) # 在0.841, 0.477点击3s后松开,实现长按
  3. # 从0.841, 0.477移动到0.827, 0.234后在0.186, 0.268松开,开始点击的时候长按0.2s,因为touch执行的特别快,按住图标后手机程序还没反应过来就结束了,导致滑动没有任何效果
  4. d.touch.down(0.841, 0.477).sleep(0.2).move(0.827, 0.234).move(0.186, 0.268).up(0.186, 0.268)

6.放大缩小

  1. # 放大缩小
  2. d(resourceId="com.vivo.gallery:id/gallery_root_bottom").pinch_in() # 缩小
  3. d(resourceId="com.vivo.gallery:id/gallery_root_bottom").pinch_out() # 放大
  4. # 指定放大缩小范围(单指1初位置)(单指2初位置)(滑动后单指1的位置)(滑动后单指2的位置)
  5. d(resourceId="com.vivo.gallery:id/gallery_root_bottom").gesture((0.51, 0.327),(0.51,0.484),(0.51,0.147),(0.51,0.772))

7.等待元素出现/消失

  1. # 等待元素出现或消失
  2. bol = d(text="哈哈").wait(timeout=3.0) # 等待元素出现,时长3s,3s内出现返回true,未出现返回false
  3. bol=d(text='哈哈').wait_gone(timeout=3) # 等待元素消失,时长3s,3s内消失true,未消失返回false

8.按键

  1. # 按键
  2. d.press("enter") # 目前仅支持 home, back, left, right, up, down, center, menu, search, enter,delete(or del), recent(recent apps), volume_up, volume_down,volume_mute, camera, power
  3. # 或
  4. d.keyevent("enter")

9.输入法切换

  1. # 输入法切换
  2. d.set_fastinput_ime(True) # 设置默认输入法与fastinputime输入法转变(True为fastinputime,false默认输入法)
  3. print(d.current_ime()) # 查看当前输入法

10.模拟fastinputime输入法键盘操作

  1. # 模拟fastinputime输入法键盘操作
  2. d.send_action(5) # 下一步
  3. # 或
  4. d.send_action("next")
  5.  
  6. # 目前仅支持如下几个
  7. """
  8. "go": 2,
  9. "search": 3,
  10. "send": 4,
  11. "next": 5,
  12. "done": 6,
  13. "previous": 7
  14. """

11.截图

  1. # 截图
  2. d.screenshot("test.png") # 当前项目目录下

12.录制

1)安装依赖:pip install -U "uiautomator2[image]"

2)方法

  1. d.screenrecord('test.mp4') # 开始
  2. time.sleep(2)
  3. d.screenrecord.stop() # 结束

13.应用管理操作

1)获取当前页面信息

  1. print(d.app_current()) # 获取当前页面信息:package,activity,pid

2)安装app

  1. d.app_install("url") # 安装app

3)启动app

  1. d.app_start("package_name")

4)获取app信息

  1. print(d.app_info("package_name")) # 获取app信息

5)退出应用

退到后台

  1. d.app_stop("package_name") # 返回主界面

清除缓存(杀进程)

  1. d.app_clear("package_name") # 杀进程清除缓存

6)获取设备ip

  1. print(d.wlan_ip) # 手机ip

7)获取设备信息(cpu,电池等)

  1. print(d.device_info) # 获取设备信息(型号,cpu,电池等信息)

8)卸载app

  1. d.app_uninstall('tv.danmaku.bili') # 卸载

9)等待应用启动

  1. """
  2. 等待应用变为当前应用,返回pid,超时未启动成功则返回0
  3. front为true表示等待app成为当前app,
  4. 默认为false,表示只要后台有这个应用的进程就会返回PID
  5. """
  6. a=d.app_wait("com.tencent.wework",6,front=True) # 返回pid
  7. print(a)

13.全局设置

1)查看默认配置

  1. print(d.settings)
  2. """
  3. {
  4. 'fallback_to_blank_screenshot': False,
  5. 'operation_delay': (0, 5), 点击元素后延迟0-5秒
  6. 'operation_delay_methods': ['click', 'swipe'], 点击元素延迟时间生效的方法(可以增加press,send_keys等 )
  7. 'wait_timeout': 20.0, 查找元素默认等待时长
  8. 'xpath_debug': False xpath日志
  9. }
  10. """

2)修改默认配置

  1. d.settings["wait_timeout"]=10 # 修改设置,按照字典来修改即可

全局等待时长还可通过implicitly_wait来设置

  1. d.implicitly_wait(10)

14.息/亮屏

  1. d.screen_off() # 息屏(锁屏)
  2. d.sleep(5)
  3. d.screen_on() # 亮屏

15.通知栏操作

  1. d.open_notification() # 打开通知栏
  2. d.open_quick_settings() # 打开通知栏设置页

16.停止ATX服务

  1. d.service("uiautomator").stop() # 停止atx服务

17.读取devices信息

  1. print(d.info)

示例:

1.小红书搜索

  1. import json
  2. import random
  3. import time
  4.  
  5. import uiautomator2 as u2
  6.  
  7. serial_number = '712KPMZ11437' # 也可以通过环境的方式 export ANDROID_SERIAL=123456f
  8. d = u2.connect(serial_number)
  9. print(d.info)
  10.  
  11. time.sleep(2)
  12.  
  13. package_name = 'com.tencent.mm'
  14. # package_name = 'com.xingin.xhs'
  15. app_info = d.app_info(package_name)
  16. # 查看应用信息, 是否已经安装
  17. print('应用信息:',json.dumps(app_info, ensure_ascii=False)) # {"versionName": "8.46.0", "versionCode": 8460909}
  18. print('设备信息:', d.device_info) # {'serial': '712KPMZ11437', 'sdk': 30, 'brand': 'google', 'model': 'Pixel 2 XL', 'arch': 'arm64-v8a', 'version': 11}
  19. print('窗口尺寸:', d.window_size()) # (1440, 2880)
  20. print('当前APP:', d.app_current()) # {'package': 'com.tencent.mm', 'activity': '.ui.LauncherUI', 'pid': 27494}
  21. print('设备序列号:', d.serial) # 712KPMZ11437
  22. print('获取WLAN的IP:', d.wlan_ip) # 192.168.1.11
  23.  
  24. d.app_start(package_name) # 打开应用程序
  25. time.sleep(random.uniform(3, 10)) # 返回一个指定范围内的浮点数(包含)
  26.  
  27. def xhs():
  28. print('点击搜索...')
  29. d(resourceId="com.xingin.xhs:id/i8p").click()
  30. time.sleep(random.uniform(1, 5))
  31. print('输入内容...')
  32. # 输入内容
  33. d(resourceId="com.xingin.xhs:id/frt").clear_text()
  34. uid = "chenger261"
  35. d(resourceId="com.xingin.xhs:id/frt").send_keys(uid)
  36. time.sleep(random.uniform(1, 5))
  37. d.press("enter")
  38. print('进行搜索')
  39.  
  40. for _ in range(0, 3):
  41. # 滑动操作
  42. d.swipe_ext('up', scale=0.8)
  43. time.sleep(random.uniform(1, 3))
  44.  
  45. # 关闭应用
  46. d.app_stop(package_name) # 只关闭指定应用

2.微信指定链接点击

  1. import json
  2. import random
  3. import time
  4. import uiautomator2 as u2
  5.  
  6. serial_number = '712KPMZ11437' # 也可以通过环境的方式 export ANDROID_SERIAL=123456f
  7. d = u2.connect(serial_number)
  8. print(d.info)
  9.  
  10. time.sleep(2)
  11.  
  12. package_name = 'com.tencent.mm'
  13.  
  14. d.app_start(package_name)
  15. time.sleep(random.uniform(3, 10)) # 返回一个指定范围内的浮点数(包含)
  16.  
  17. def wechat():
  18. # 找到指定对话框
  19. print('点击进入文件传输助手...')
  20. # 方式1
  21. # d(text="文件传输助手").click(timeout=3)
  22. # 方式2
  23. d(className="android.widget.LinearLayout").child(text='文件传输助手').click(timeout=3)
  24.  
  25. print('已经进入文件传输助手!!!')
  26.  
  27. time.sleep(3)
  28. # 点击指定链接
  29. print('点击指定链接地址')
  30. d(text="https://www.cnblogs.com/xingxia").click(timeout=3)
  31. time.sleep(5)
  32. # 返回
  33. d.press('back')
  34. d.press('back')

更多参考:

移动端自动化之uiautomator2的更多相关文章

  1. 移动端自动化自动化(Android&iOS)——Appium

    Appium-Python 移动端自动化环境搭建 Appium介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及Firefox ...

  2. 【待考察】Appium使用技巧,助你快速入门移动端自动化!

    Appium使用技巧,助你快速入门移动端自动化! 原创: 柠檬班superman 柠檬班软件测试 1月4日 关注并置顶[柠檬班]的小哥哥小姐姐 “猪”年行大运 说说最近研究移动端的自动化 移动端的自动 ...

  3. 接口自动化、移动端、web端自动化如何做?

    1.<Python+Appium移动端自动化项目实战>-带您进入APP自动化测试的世界https://yuedu.baidu.com/ebook/765b38a5690203d8ce2f0 ...

  4. 移动端自动化测试之adb常用命令

    今天我们来聊聊自动化测试过程中常用的adb命令. 简介 首先介绍下什么是adb,adb全称叫“android debug bridge”,翻译过来就叫调试桥,通过命令行指令,可让你与移动端设备进行相互 ...

  5. 移动端自动化测试之android模拟器问题集合

    黑屏 在做移动端自动化测试过程中,android模拟器启动黑屏的问题一直困扰着我,网上找了许多方法尝试了都不能解决我的问题,最后重新安装了镜像文件,问题才得以解决,当然并不是网上的解决办法都是错的,只 ...

  6. 聊聊 PC 端自动化最佳方案 - Pywinauto

    1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...

  7. App 端自动化的最佳方案,完全解放双手!

    1. 前言 大家好,我是安果! 之前写过一篇文章,文中提出了一种方案,可以实现每天自动给微信群群发新闻早报 如何利用 Python 爬虫实现给微信群发新闻早报?(详细) 但是对于很多人来说,首先编写一 ...

  8. C端自动化实现:appium+winappdriver+python

    一. 前言 有小伙伴有办公自动化的需求,特此出一篇C端自动化教程,并附带demo案例.C端的自动化比B端多一个appium,其他的操作大同小异. 二. 环境 appium:exe工具,用于启动服务,官 ...

  9. 手机APP自动化之uiautomator2 +python3 UI自动化

    题记: 之前一直用APPium直到用安卓9.0  发现uiautomatorviewer不支持安卓 9.0,点击截屏按钮 一直报错,百度很久解决方法都不可以,偶然间看见有人推荐:uiautomator ...

  10. 移动端自动化测试之Appium的工作原理学习

    Appium 简介 参考官网文档说明:http://appium.io/docs/en/about-appium/intro/ Appium官方文档上介绍,Appium 是一个自动化测试的开源工具,支 ...

随机推荐

  1. Pipeline流水线通过git拉取Jenkinsfile报错 error: RPC failed; result=22, HTTP code = 404

    Pipeline流水线通过git拉取Jenkinsfile报错 error: RPC failed; result=22, HTTP code = 404 在学习共享库时使用通过git拉取jenkin ...

  2. 坑人的opencv安装

    我想捡起来C++,最近在看opencv,于是我想着一起吧. 但是我低估了这个小麻烦的魅力,曾经安装opencv c++版本就头秃,如今依然头秃.说明我没长进啊-- 折腾了两天,终于装上了. 其中最麻烦 ...

  3. 小tips:postMessage处理iframe跨域通信

    实例 父页面发消息给子页面,子页面接收消息后回复父页面. 父页面代码: <body> 父级页面: <button id="btn">给iframe子页面传递 ...

  4. JavaScript – 冷知识 (新手)

    当 charAt 遇上 Emoji 参考: stackoverflow – How to get first character of string? 我们经常会用 charAt(0) 来获取 fir ...

  5. LeetCode 1397. Find All Good Strings 找到所有好字符串 (数位DP+KMP)

    好题- 就是比平时的 hard 难了一些-- 虽然猜出是数位DP了-不过比我之前做的题,好像多了一维,印象中都是一维记录之前状态就够了--然后就没做出-- 至于 KMP 的应用更是神奇,虽然掌握的 k ...

  6. linux中安装mysq5.7

    linux中安装mysq5.7 一. 安装mysql yum install mariadb-server mariadb 二. 开启mysql service mysqld start 四. 停止m ...

  7. Android UsbDeviceManager 代码分析

    USBDeviceManager是一个Android系统中用于管理USB设备的类,它是系统服务之一.其主要功能是控制USB设备的连接和断开,以及管理USB设备的权限和状态.下面是对USBDeviceM ...

  8. torch和numpy的相互转换

    import torch x = torch.rand(2,2) x1 = x.numpy() # torch转换到numpy x2 = torch.from_numpy(x1) #numpy转换to ...

  9. C#/.NET/.NET Core优秀项目和框架2024年9月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍.功能特点.使用方式以及部分功能截图 ...

  10. JDBC连接数据库(mysql)基本实现-七步

    // 包名 package com.zhulx; import java.sql.DriverAction; import java.sql.DriverManager; import java.sq ...