1、安装
-
pip install --pre uiautomator2
-
#或者你可以直接从github源码安装
-
-
pip install -e uiautomator2
pip install pillow #截屏工具
2、初始化手机,需要的环境sdk
-
python -m uiautomator2 init
3、打开手机端口:adb forward tcp:7912 tcp:7912
连接手机device_ip=127.0.0.1
4、常用命令:
-
-
2、清缓存:python -m uiautomator2
-
3、停止所有应用:python -m uiautomator2 app-stop-all $ device_ip
-
4、截图:python -m uiautomator2截图$ device_ip screenshot.jpg
-
5、检查守护线程:d.healthcheck()
-
6、打开调试:d.debug = true
-
7、获取连接信息:d.info
-
8、shell命令:d.adb_shell(' pwd ')
-
9、分辨率:d.window_size()
-
10、查看当前应用信息:d.current_app()
-
11、查看序列号:d.serial
5、连接:
-
import uiautomator2 as u2
-
#通过WIFI
-
d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')
-
#通过usb获取 devices
-
d = u2.connect('123456f') # alias for u2.connect_usb('123456f')
6、系统操作:
-
-
2、启动:d.app_start(“ com.example.hello_world ”)#以包名称开头
-
3、停止应用:d.app_stop( “ com.example.hello_world ”)或者d.app_clear( ' com.example.hello_world ')
-
4、停止所有应用:d.app_stop_all()
-
5、推送一个文件到手机:d.push( “ foo.txt的”, “ / SD卡/ ”)
-
6、推和重命名 :d.push( “ foo.txt的”, “ /sdcard/bar.txt ”)
-
7、推送并更改文件模式:d.push("foo.sh", "/data/local/tmp/", mode=0o755)
-
8、从设备中拉取文件:d.pull(“/ sdcard/tmp.txt ”,“ tmp.txt ”)#如果文件在设备上找不到,FileNotFoundError将会出现
-
d.pull(“/ sdcard/some-file-not-exists.txt ”,“ tmp.txt ”)
7、app连接会话:
-
-
-
3、检测应否崩溃:sess(text="Music").click()
-
4、检查会话是否正常:sess.running()
8、手机操作
-
1、d.screen_on()#打开屏幕 d.screen_off()#关闭屏幕
-
2、获取当前屏幕状态:d.info.get(' screenOn ‘)# android 4.4
-
3、按软/硬件
-
d.press("home") #按home键,用键名
-
d.press("back") #按返回键,与主要的名称
-
d.press(0x07, 0x02) #按下键码0×07(” 0')与META ALT(0x02)
-
这些目前支持:
-
home
-
back
-
left
-
right
-
up
-
down
-
center
-
menu
-
search 搜索
-
enter 输入
-
delete(or del)删除
-
recent(recent apps)
-
volume_up 提高音量
-
volume_down 减小音量
-
volume_mute 关闭声音
-
camera 相机
-
power
-
4、解锁屏幕d.unlock()
9、事件:
-
支持百分比d.long_click(0.5, 0.5)
-
1、点击屏幕:d.click(x,y)
-
2、长按屏幕:d.long_click(x,y)或d.long_click(x,y,0.5)#长按0.5s(默认)
-
3、拖动:d.drag(sx,sy,ex,ey)或d.drag(sx,sy,ex,ey,0.5)#刷新0.5s(默认)
-
4、刷卡:d.swipe(sx,sy,ex,ey)或d.swipe(sx,sy,ex,ey,0.5)#刷新0.5 秒(默认)
-
5、滑动:#由点划动(X0,Y0)到点(X1,Y1),然后到点(X2,Y2)
-
#时间将加速0.2秒bwtween两点
-
d.swipe((X0,Y0),(X1,Y1),( x2,y2), 0.2)
10、屏幕相关:
-
1、获取方向:d.orientation
-
2、设置方向:d.set_orientation('l')
-
值:natural 或者 n
-
left 或者 l
-
right 或者 r
-
upsidedown 或者 u (不能设置)
-
3、不能选择/解冻:d.freeze_rotation()#冻结旋转 d.freeze_rotation( False)
-
4、截屏:image = d.screenshot() #支持png和jpg
-
image.save("home.jpg")
-
5、截屏:这个不知道什么意思
-
import cv2
-
image = d.screenshot(format='opencv')
-
cv2.imwrite('home.jpg', image)
-
6、屏幕UI转xml:xml = d.dump_hierarchy()
-
7、打开通知或快速设置:d.open_notification() d.open_quick_settings()
支持的参数:
text,textContains,textMatches,textStartsWith
className, classNameMatches
description,descriptionContains,descriptionMatches,descriptionStartsWith
checkable,checked,clickable,longClickable
scrollable,enabled,focusable,focused,selected
packageName, packageNameMatches
resourceId, resourceIdMatches
index, instance
-
1、选择:d(text='Clock', className='android.widget.TextView')
-
2、获取孩子或孙子:d( className = “ android.widget.ListView ”).child( text = “ Bluetooth ”)
-
3、兄弟姐妹:d(text="Google").sibling(className="android.widget.ImageView")
-
4、获取子节点根据文本:d(className="android.widget.ListView", resourceId="android:id/list")
-
.child_by_text("Bluetooth", className="android.widget.LinearLayout")
-
5、获取子节点根据文本允许滚动搜素:d(className="android.widget.ListView", resourceId="android:id/list")
-
.child_by_text("Bluetooth",allow_scroll_search=True,className="android.widget.LinearLayout")
-
6、支持多级:d(className = “ android.widget.ListView ”,resourceId = “ android:id / list ”)
-
.child_by_text(“ Wi-Fi ”,className = “ android.widget.LinearLayout ”)
-
.child(className = “ android .widget.Switch “) .click
-
()
-
7、支持相对定位:
-
• d(A).left(B),在A的左侧选择B.
-
• d(A).right(B),在A的右侧选择B.
-
• d(A).up(B),在A之上选择B.
-
• d(A).down(B),在A下选择B.
-
d(text="Wi‑Fi").right(className="android.widget.Switch").click()
-
8、第一个文本带有“Add new”的实例:d(text = “ Add new ”,instance = 0)
-
9、在屏幕上查找:d(text="Add new").count
-
d(text="Add new”)[0]#第一个
-
d(text="Add new”)[1]#第二个
-
10、显示控件信息:view.info
-
11、检查控件是否存在:d(text = “ Settings ”).exists或者d.exists(text = “ Settings ”)
-
12、检查控件信息:d(text = “设置”).info
-
13、文本控件操作:
-
d(text = “ Settings ”).get_text() #获取小部件文本
-
d(text = “ Settings ”).set_text(“ My text ... ”) #设置文本
-
d(text = “ Settings ”).clear_text ) #清除文字
-
14、点击:
-
d( text = “ Settings ”).click()
-
#等待元素出现最多10秒钟,然后点击
-
d( text = “ Settings ”).click( timeout = 10)
-
#点击的别名
-
d(文本= “设置”).tap()
-
15、长按:d( text = “ Settings ”).long_click()
-
16、拖动元素到另一个位子:
-
d( text = “ Settings ”).drag_to(x,y, duration = 0.5)
-
d( text = “ Settings ”).drag_to( text = “ Clock ”, duration = 0.25)#clock的中心点
-
17、从一点到另一点的两点手势
-
d(text = “ Settings ”).gesture((sx1,sy1),(sx2,sy2),(ex1,ey1),(ex2,ey2))
-
18、特定UI对象上的两点手势
-
• In,从边缘到中心
-
• Out,从中心到边缘
-
#从边缘到中心。这里是“以”不“在”
-
d(text="Settings").pinch_in(percent=100, steps=10)
-
#从中心到边缘
-
d(text="Settings").pinch_out()
-
19、等待ui出现或消失
-
d(text="Settings").wait(timeout=3.0) # return bool
-
d(text="Settings").wait_gone(timeout=1.0)
-
20、#设置默认元素等待超时(秒)
-
d.wait_timeout = 30.0
-
21、控件不知道控件的情况下
-
d.set_fastinput_ime(True)#切换成FastInputIME输入法
-
d.send_keys(“你好123abcEFG ”)# adb广播输入
-
d.clear_text()#清除输入框所有内容(需要android-uiautomator.apk版本> = 1.0.7 )
-
d.set_fastinput_ime(False)#切换成正常的输入法
-
22、显示:Toast
-
d.make_toast("Hello world")
-
d.make_toast("Hello world", 1.5) # show for 1.5s
child_by_description就是找到孙子有特定描述的儿童,其他参数与之相似child_by_text。
child_by_instance就是要找到在其子层次结构中指定实例的任何位置具有子UI元素的子元素。它在没有滚动的可见视图上执行。
详细信息请参阅下面的链接: • UiScrollable,getChildByDescription,getChildByText,getChildByInstance
6、常见的问题:
1、发现sdk的某些功能或手机的不能用:直接打开uiautomator的应用程序(INIT成功后,就会安装上的),点击关 闭UIAutomator 或者 d.service(“ uiautomator ”).stop()
2、502错误:
-
控制台:adb shell am instrument -w -r -e debug false -e class com.github.uiautomator.stub.Stub
-
com.github.uiautomator.test/android.support.test.runner.AndroidJUnitRunner
如果运行正常,启动测试之前增加一行代码d.healthcheck()
如果报错,可能是缺少某个设备组件没有安装,使用下面的命令重新初始化 python -m uiautomator2 init --reinstall
手机python -m uiautomator2 init之后,浏览器输入<device_ip:7912>,会发现一个远程控制功能,延迟非常低噢。^ _ ^
原文链接:https://blog.csdn.net/qq_38071435/article/details/80003212