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

[安装]

pip3 install -U uiautomator2

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

[使用]

import uiautomator2 as u2

d = u2.connect() # connect to device
print(d.info)

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

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


元素定位页面:

常用方法:

常用定位方式:
ResourceId定位:
d(resourceId="com.meizu.mzbbs:id/tp").click() Text定位:(很有用)
d(text="精选").click() Description定位:
d(description="..").click() ClassName定位:
d(className="android.widget.TextView").click()

支持组合定位: 同时指定className和text
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.点击

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

2.长按

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

3.文本

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

4.拖拽

1)元素到元素拖拽

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

2)元素到坐标拖拽

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

3)坐标到坐标拖拽

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

5.滑动

1)元素滚动

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

2)屏幕滚动

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

也可直接操作滑动

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

3)界面滚动

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

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

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

滚动置某一个元素停下来

# 滚动置某个元素停下
d(scrollable=True).scroll.vert.backward.to(resourceId="id/title", text="《系列》电影") # 水平向上滚动到指定元素停下,向上找不到元素会往下滚动
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)  在某点松开

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

# 放大缩小
d(resourceId="com.vivo.gallery:id/gallery_root_bottom").pinch_in() # 缩小
d(resourceId="com.vivo.gallery:id/gallery_root_bottom").pinch_out() # 放大
# 指定放大缩小范围(单指1初位置)(单指2初位置)(滑动后单指1的位置)(滑动后单指2的位置)
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.等待元素出现/消失

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

8.按键

# 按键
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
# 或
d.keyevent("enter")

9.输入法切换

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

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

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

11.截图

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

12.录制

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

2)方法

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

13.应用管理操作

1)获取当前页面信息

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

2)安装app

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

3)启动app

d.app_start("package_name")

4)获取app信息

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

5)退出应用

退到后台

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

清除缓存(杀进程)

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

6)获取设备ip

print(d.wlan_ip)  # 手机ip

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

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

8)卸载app

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

9)等待应用启动

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

13.全局设置

1)查看默认配置

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

2)修改默认配置

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

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

d.implicitly_wait(10)

14.息/亮屏

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

15.通知栏操作

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

16.停止ATX服务

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

17.读取devices信息

print(d.info)

示例:

1.小红书搜索

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

2.微信指定链接点击

import json
import random
import time
import uiautomator2 as u2 serial_number = '712KPMZ11437' # 也可以通过环境的方式 export ANDROID_SERIAL=123456f
d = u2.connect(serial_number)
print(d.info) time.sleep(2) package_name = 'com.tencent.mm' d.app_start(package_name)
time.sleep(random.uniform(3, 10)) # 返回一个指定范围内的浮点数(包含) def wechat():
# 找到指定对话框
print('点击进入文件传输助手...')
# 方式1
# d(text="文件传输助手").click(timeout=3)
# 方式2
d(className="android.widget.LinearLayout").child(text='文件传输助手').click(timeout=3) print('已经进入文件传输助手!!!') time.sleep(3)
# 点击指定链接
print('点击指定链接地址')
d(text="https://www.cnblogs.com/xingxia").click(timeout=3)
time.sleep(5)
# 返回
d.press('back')
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. c++字符编码转换

    c++字符编码转换 简述 字符编码一直是软件开发中很麻烦的问题.当前项目开发普遍使用的字符集是utf-8,而windows系统则默认是gbk,linux默认编码则是utf-8,所以想要开发一个在win ...

  2. RedisCluster集群架构原理与通信原理

    redis 参考目录: 生产级Redis 高并发分布式锁实战1:高并发分布式锁如何实现 https://www.cnblogs.com/yizhiamumu/p/16556153.html 生产级Re ...

  3. Python 潮流周刊#68:2023 年 Python 开发者调查结果(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  4. elementUI实现月、季度、年 时间选择框

    elementUI实现月.季度.年 时间选择框 一.通过 el-date-picker 组件来实现月.年的选择 代码如下: <el-date-picker v-if="dateType ...

  5. Vs Code, Visual Studio 2022, Angular and Live Server Running Through Https and IP Address

    前言 之前就写过 angular cli, vs code liveserver, vs 2019 iis express 10, vs code kestrel 使用 https + ip. 但写的 ...

  6. CF228E 题解

    CF228E 题解 题目简述 给定一个 \(n\) 个点,\(m\) 条边的无向图,每条边都为 \(0\) 或 \(1\),可以进行若干次操作,与此点相连的所有点权值取反,求一种方案使得所有边都变为 ...

  7. DDL-操作表

    1.查询表 查询当前数据库下所有表名称 show tables; 查询表结构 desc 表名称; 2.创建表 create table 表名 ( 字段名1 数据类型1, 字段名2 数据类型2, ... ...

  8. QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家

    QT原理与源码分析之QT5原理与源码分析视频课程 补天云QT技术培训专家 以下是<< QT5原理与源码分析视频课程>>的完整目录. 第1章 准备 第1节 您可以学到什么? 第2 ...

  9. Linux板子与ubuntu交互,NFS配置

    第0步:保证你的ubuntu能上网,可以选择NAT方式让ubuntu上网. 第一步:安装NFS服务 sudo apt-get install nfs-kernel-server portmap 第二步 ...

  10. java基础 -网络编程笔记

    666,InetAddress package com.hspedu.api; import java.net.InetAddress; import java.net.UnknownHostExce ...