【uiautomator2】使用详解

  • Post author:
  • Post category:其他




【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()



总结

以上就是今天要讲的内容,希望对大家有所帮助!!!



版权声明:本文为Trees__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。