【uiautomator2】使用详解
文章目录
1. 准备工作
1. 安装
pip install --upgrade --pre uiautomator2
2. 安装手机模拟器,市面上的都可以
3. 安装Android 调试桥 (adb)
https://developer.android.google.cn/studio/releases/platform-tools?hl=zh-cn
4. 将安装后的SDK platform-tools 配置到环境变量中
5. 验证是否正常的方法,进入cmd中输入adb,不报错即可
2. 如何连接手机
2.1 usb连接
# 可以在cmd上输入 ’adb devices‘ 指令查看连接的设备的序列号
device = u2.connect('传入手机序列号')
print(device.device_info)
2.2 wifi地址连接
# 电脑和手机在同一个局域网内
device = u2.connect('http://192.168.110.3')
device = u2.connect_wifi('192.168.110.2')
device = u2.connect_wifi('192.168.110.3::8820')
# 连接成功后可以打印手机的基本信息
print(device.device_info)
# 可以在cmd上输入指令查看连接的设备
adb devices
2.3 查看手机转发端口
adb forward --list
3. 基本使用
初始化设备 python -m uiautomator2 init
import uiautomator2 as u2
# 连接手机
device = u2.connect()
# 打开被测软件
device(text='软件名称').click()
4. app的操作
import uiautomator2 as u2
# 连接手机
device = u2.connect('4d5easd45')
device.app_install('安装的地址') # 安装
device.app_uninstall('package_name') # 卸载
device.app_start('package_name') # 启动app
device.app_stop('package_name') # 关闭app
device.app_current() # 获取当前正在运行的app的包名
device.app_info() # 获取app的信息
device.app_list_running() # 列出正在运行的app,这个也可以获取包名
device.app_clear('paceage_name') # 清除app数据
5. 设备操作
import uiautomator2 as u2
# 连接手机
device = u2.connect('4d5easd45')
device.info() # 获取设备基本
device.device_info() # 获取设备详细信息
device.window_size() # 获取设备大小
device.screenshot('d:/hello.png') # 获取设备的截屏 传入电脑存放的路径
# 推送文件(上传文件) 第一个参数 PC需要上传的文件路径 第二个参数 手机端存放路径
# 想要知道手机里的文件结构可以使用 adb shell 命令操作和linux差不多
device.push('d:/hello.png','/data/')
device.pull('/data/hello.png','d:/desktop/') # 拉取文件和推送文件传参数相反
6. 手机按键操作
import uiautomator2 as u2
# 连接手机
device = u2.connect('4d5easd45')
device.screen_on() # 亮屏
device.screen_off() # 熄屏
device.press("home") # 首页
device.press("back") # 返回键
device.press("left") # 左移
device.press("right") # 右移
device.press("up") # 上划
device.press("down") # 下划
device.press("center") # 回到中间页
device.press("menu") # 菜单
device.press("search") # 搜索框
device.press("enter") # 回车键
device.press("delete") # 删除键
device.press("recent") # 打开最近的页面
device.press("camera") # 打开照相机
device.press("power") # 电源键
device.press("volume_up") # 声音调大
device.press("volume_down") # 声音调小
device.press("volume_mute") # 静音
7. 元素定位
pip install weditor
安装weditor (定位辅助工具)
终端中输入python -m weditor
启动weditor
"""
文本定位(也就是web上 text属性) : text , textcontains , textMatches , textstartswith
类名定位(也就是web上 class属性) : c1assName , classNameMatches
描述内容定位(app描述内容) : description , descriptioncontains , descriptionMatches ,descriptionstartswith
checkable , checked , clickable , longclickab1e
scro11able , enab1ed , focusable , focused , selected
包名定位 : packageName , packageNameMatches
资源ID定位(也就是web上 id属性) : resourceId , resourceIdMatchesindex
index , instance
"""
7.1 多属性定位
# 当定位的时候会遇到一个属性没办法精准定位
device(className='android.widget.TextView')
# 要选text是'hello',className 是'android.widget.TextView' 的元素
device(text='hello', className='android.widget.TextView')
7.2 获取同级和子级的UI对象
# 获取 child
d(className="android.widget.ListView").child(text="hello")
# 获取 sibling
d(text="首页").sibling(text="副页")
7.3 相对位置
# 可以用相对位置的方法来获取当前视图中的对象: left, right, top, bottom
# 选择"WiFi" 右侧的"switch"
d(text="WiFi").right(className="android.widget.Switch").click()
也可以 d(text="WiFi").right().click()
7.4 instance
# 有时候会遇到屏幕上有包含相同特点(例如文本)的多个对象
device(text="hello", instance=0) # 获取第一个文本中带有“hello”的元素对象
# uiautomator也提供了类似列表的方法来处理类似的元素对象
device(text="hello")[0]
8. app事件操作
8.1 点击操作
# 全局设置每次单击UI后再次单击之间延迟1.5秒
device.click_post_delay = 1.5 # 默认无延迟
# 第一种:先进行元素定位 再进行点击事件
device(text='appName').click()
# 第二种:通过绝对坐标触发点击事件(x,y)
# 个人不推荐使用这个,因为每台手机的分辨率不同
device.click(182,235)
# 第三种:通过百分比坐标触发点击事件(x,y)
device.click(0.2,0.8)
拓展:
# 长按屏幕
device.long_click(x, y)
device.long_click(x, y, 0.5) # long click 0.5s (default)
8.2 滑动操作
"""
对(可滚动)ui对象执行fling
Fling(飞滑)一般用于水平或垂直翻页
"""
# fling默认垂直向前
device(scrollable=True).fling()
# fling水平向前
device(scrollable=True).fling.horiz.forwardevice()
# fling垂直向后
device(scrollable=True).fling.vert.backwardevice()
# 垂直fling到开始
device(scrollable=True).fling.horiz.toBeginning(max_swipes=1000)
# 垂直fling到末尾
device(scrollable=True).flingg.toEnd()
"""
对(可滚动)ui对象执行scroll
"""
# scroll 默认垂直向前
device(scrollable=True).scroll(steps=10)
# scroll水平向前
device(scrollable=True).scroll.horiz.forward(steps=100)
# scroll垂直向后
device(scrollable=True).scroll.vert.backward()
# 水平scroll到开始
device(scrollable=True).scroll.horiz.toBeginning(steps=100, max_swipes=1000)
# 垂直scroll到末尾
device(scrollable=True).scroll.toEnd()
# scroll 向前垂直,直到出现指定ui object
device(scrollable=True).scroll.to(text="Security")
"""
swipe 平滑
第一种方式:需要传入四个参数
startX:起始X坐标
startY:起始Y坐标
endX:结束X坐标
endY:结束Y坐标
"""
device.swipe(500,500,100,500)
"""
第二种方式:需要传入两个参数
direction(滑动的方向) : up、down、left、right
scale(滑动的百分比)
"""
device.swipe_ext('left',scale=0.9)
"""
第三种方式:先进行元素定位 再滑动
direction(滑动的方向) : up、down、left、right
steps(滑动的速度) ms
"""
e = device(text='appname')
e.swipe('left',steps=100)
8.3 用户输入和清空操作
# 先进行元素定位 再进行输入操作
userinput = device(text='userName')
userinput.send_keys('Mr.Tree')
# 清空输入内容
userinput.clear_text()
8.4 智能等待
# 适用场景:app打开速度相较于程序执行速度过慢,需要等待app打开后再执行下面的代码
# 设置全局的超时时间 10s
device.wait_timeout = 10
# 开启智能等待,即app完全打开后才执行后面代码
device.app_start('packagename',wait=True)
# 只要设置了全局的超时时间,则其他的操作也会内置智能等待,不需要再进行任何操作
例如: d.wait_activity() 等待页面加载出来
d().wait() 等待元素出现
d().wait_gone() 等待元素消失
d().exists() 等待元素是否存在
9. toast消息
# 显示Toast消息
device.toast.show("Hello world")
# 获取Toast
device.toast.get_message()
# 清空 cached toast
device.toast.reset()
# 断言
assert "Short message" == d.toast.get_message()
总结
以上就是今天要讲的内容,希望对大家有所帮助!!!