前言:
很多时候,想要学习一个陌生领域的知识时,需要先定一个或基础或高阶的目的,这个目标最好带有趣味性,然后锚定这个目标;或许最终目标很轻松就被实现了,也或许最终发现目标实在太高难以实现;这些都没有关系,一步步探索,一步步走进目标的过程并在这个过程中得到提升才是学习的真正意义所在。
在一步步试探的过程中,我们会思考、搜索资料、质疑是否有更好的实现方式;这一路的过程可以概括为:
——了解它
——走近它
——观察它/测试它
——改造它/思考测试
——创造另一个它
只要自己不停止研究,目标只会越来越近;正所谓:日拱一卒,功不唐捐是也。
一、下载安装python
https://www.python.org/downloads/windows/
根据自己的OS版本选择安装
二、安装uiautomator2包
安装uiautomator2
pip install uiautomator2 -i https://pypi.douban.com/simple/
或者(建议在virtualenv下操作)
pip install --pre -U uiautomator2
需要较长时间!!!!
三、安装ADB工具
ADB下载路径:
Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip
Mac版本:https://dl.google.com/android/repository/platform-tools-latest-darwin.zip
Linux版本:https://dl.google.com/android/repository/platform-tools-latest-linux.zip
将文件下载下来,解压缩到自定义的安装目录即可。
也可以直接安装Android SDK;在Android SDK安装目录下的platform-tools文件夹中可以找到adb.exe程序。
四、对移动设备执行初始化
首先确保
1.手机设备成功接通到电脑(USB或WIFI);
2.手机开启了调试模式;
以下几项权限比较重要:
——开启开发者模式(必要)
——USB调试(必要)
——USB安装(必要)
——USB模拟点击(必要)
——指针位置(建议开启,非强制)
没开启前,我们再电脑上使用adb devices看到的结果是这样的:
3.电脑上安装adb工具(包含在Android SDK中,也可以单独安装);建议架构adb工具为位置加入环境变量PATH
注意:下图的显示是根据你手机启用的调试模式显示的
USB调试是这样:
对移动设备初始化
这个是最重要的操作。
这个过程会在移动设备上,安装一个agent(需要手机调试模式中允许调试安装app)
python -m uiautomator2 init
如果提示(这个很重要,事个常见报错)
ModuleNotFoundError: No module named 'dataclasses'
就安装这个库
pip install dataclasses
再次运行就可以看到安装成功了:(有些手机需要插入SIM卡才可以开启调试模式下安装软件的功能;根据要求满足开启条件就行。)
(myenv) PS D:\xiamingliang\project001> python -m uiautomator2 init
[I 221022 09:30:55 init:156] uiautomator2 version: 2.16.19
[I 221022 09:30:55 init:373] Install minicap, minitouch
[D 221022 09:30:55 init:59] Use cached assets: C:\Users\Administrator.DESKTOP-QBI8U5R\.uiautomator2\cache\minitouch-f7a806902f\minitouch
[D 221022 09:30:55 init:238] Push to /data/local/tmp/minitouch:0755
[I 221022 09:30:55 init:379] Android R (sdk:30) has no minicap resource
[D 221022 09:30:56 init:256] apk-debug package-info: None
[D 221022 09:30:56 init:257] apk-debug-test package-info: None
[I 221022 09:30:56 init:388] Install com.github.uiautomator, com.github.uiautomator.test 2.3.3
[D 221022 09:30:56 init:167] Shell: ('pm', 'uninstall', 'com.github.uiautomator')
[D 221022 09:30:56 init:167] Shell: ('pm', 'uninstall', 'com.github.uiautomator.test')
[D 221022 09:30:56 init:59] Use cached assets: C:\Users\Administrator.DESKTOP-QBI8U5R\.uiautomator2\cache\app-uiautomator.apk-d3f17174fb\app-uiautomator.apk
[D 221022 09:30:56 init:238] Push to /data/local/tmp/app-uiautomator.apk:0644
[D 221022 09:30:57 init:167] Shell: ('pm', 'install', '-r', '-t', '/data/local/tmp/app-uiautomator.apk')
[I 221022 09:31:16 init:331] - app-uiautomator.apk installed
[D 221022 09:31:16 init:59] Use cached assets: C:\Users\Administrator.DESKTOP-QBI8U5R\.uiautomator2\cache\app-uiautomator-test.apk-652bf9e13c\app-uiautomator-test.apk
[D 221022 09:31:16 init:238] Push to /data/local/tmp/app-uiautomator-test.apk:0644
[D 221022 09:31:16 init:167] Shell: ('pm', 'install', '-r', '-t', '/data/local/tmp/app-uiautomator-test.apk')
[I 221022 09:31:23 init:331] - app-uiautomator-test.apk installed
[D 221022 09:31:23 init:167] Shell: ('/data/local/tmp/atx-agent', 'server', '--stop')
[I 221022 09:31:23 init:346] Install atx-agent 0.10.0
[D 221022 09:31:23 init:59] Use cached assets: C:\Users\Administrator.DESKTOP-QBI8U5R\.uiautomator2\cache\atx-agent_0.10.0_linux_armv7.tar.gz-cf3333ae7b\atx-agent_0.10.0_linux_armv7.tar.gz
[D 221022 09:31:23 init:238] Push to /data/local/tmp/atx-agent:0755
[D 221022 09:31:24 init:167] Shell: ('/data/local/tmp/atx-agent', 'server', '--nouia', '-d', '--addr', '127.0.0.1:7912')
[I 221022 09:31:24 init:350] Check atx-agent version
[D 221022 09:31:24 init:359] Forward: local:tcp:15957 -> remote:tcp:7912
[D 221022 09:31:25 init:359] Forward: local:tcp:15957 -> remote:tcp:7912
[D 221022 09:31:25 init:362] atx-agent version 0.10.0
[D 221022 09:31:25 init:366] device wlan ip: 192.168.88.105
Successfully init AdbDevice(serial=c******0)
(myenv) PS D:\xiamingliang\project001>
并且,在你的手机上,也会有一个ATX
所以刚才我们输入的uiautomator init
命令会执行哪些操作呢 ?
他会安装3个包,
- uiautomator-server:谷歌原生的uiautomator
- atx-agent:uiautomator的守护进程
- atx-agent增加远程控制的功能,依赖minicap和minitouch这两个工具
初始化完成后,既可以在这个目录下C:\Users\Administrator\.uiautomator2\cache
看到这几个包了:(这个不重要,看不到也没啥影响的)
五、连接手机
1.通过USB方式
>>> import uiautomator2
>>> conn = uiautomator2.connect_usb('c******0') #adb devices显示的设备id
>>> print(conn.info)
[D 221022 09:42:32 __init__:656] [pid:10108] [c******0] kill process(ps): uiautomator
[D 221022 09:42:33 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 40.0s
[D 221022 09:42:34 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 39.0s
[D 221022 09:42:35 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 37.9s
[D 221022 09:42:36 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 36.9s
[D 221022 09:42:37 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 35.9s
[D 221022 09:42:38 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 34.9s
[D 221022 09:42:39 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 33.8s
[D 221022 09:42:40 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 32.8s
[D 221022 09:42:41 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 31.8s
[D 221022 09:42:42 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 30.8s
[D 221022 09:42:42 __init__:691] [pid:10108] [c******0] show float window
[D 221022 09:42:43 __init__:678] [pid:10108] [c******0] uiautomator-v2 is starting ... left: 29.6s
[I 221022 09:42:43 __init__:638] [pid:10108] [c******0] uiautomator back to normal
{'currentPackageName': 'com.miui.home', 'displayHeight': 2276, 'displayRotation': 0, 'displaySizeDpX': 393, 'displaySizeDpY': 873, 'displayWidth': 1080, 'productName': 'munch', 'screenOn': True, 'sdkInt': 31, 'naturalOrientation': True}
>>>
可以看到设备的信息可以这个正常获取并显示。
2.通过WIFI方式
>>> import uiautomator2
>>> conn = uiautomator2.connect_adb_wifi('your phone ip address')
>>> print(conn.info)
3.uiautomator2其他常用的function
function:
_fix_wifi_addr:
_is_tmq_production:
connect: Args:
connect_adb_wifi: Run adb connect, and then call connect_usb(..)
connect_usb: Args:
connect_wifi: Args:
deprecated: This is a decorator which can be used to mark functions
list2cmdline:
namedtuple: Returns a new subclass of tuple with named fields.
process_safe_wrapper: threadsafe for process calls
retry: Returns a retry decorator.
setup_logger: Configures and returns a fully configured logger instance, no hassles.
thread_safe_wrapper:
六:用python做个调试程序
import uiautomator2
import time
import random
def douyin():
#通过usb连接;c******0是adb devices -l列出的被调试手机id(手机上要点击允许)
cnotallow=uiautomator2.connect_usb('c******0') #替换成自己的
# 打开抖音
conn(text="抖音").click() #没打开时使用,打开程序后就不需要了
runcount_init = 0
runcount_all = 10 #划几次
while runcount_init < runcount_all:
# 滑动视频
# 向下滑
conn.swipe(round(random.uniform(700,720),2),round(random.uniform(1650,1670),2),round(random.uniform(830,850),2),round(random.uniform(300,320),2),duratinotallow=random.uniform(0.01,0.1)) #调整duration控制滑动速度
time.sleep(random.uniform(0.5,1.5))
# 向上滑
conn.swipe(round(random.uniform(810,800),2),round(random.uniform(1160,1200),2),round(random.uniform(775,785),2),round(random.uniform(1750,1800),2),duratinotallow=random.uniform(0.01,0.1))
time.sleep(random.uniform(0.5,1.5))
runcount_init = runcount_init + 1
if __name__=='__main__':
douyin()
七:补充信息
几种常用的定位APP方式如下:
1.text:a(text=“抖音”).click() #需要程序在屏幕最上层(如果APP在抽屉或者不在当前页面则无法定位并打开的)
2.resourceid:a(resourceId=“com.smartisanos.clock:id/text_stopwatch”).click()
3.classname:a(className=“android.widget.TextView”).click()
4.description :a(descriptinotallow="…").click()
更多的方法参考:
名称 | 描述 |
text | text是指定文本的元素 |
textContains | text中包含有指定文本的元素 |
textMatches | text符合指定正则的元素 |
textStartsWith | text以指定文本开头的元素 |
className | className是指定类名的元素 |
classNameMatches | className类名符合指定正则的元素 |
description | description是指定文本的元素 |
descriptionContains | description中包含有指定文本的元素 |
descriptionMatches | description符合指定正则的元素 |
descriptionStartsWith | description以指定文本开头的元素 |
checkable | 可检查的元素,参数为True,False |
checked | 已选中的元素,通常用于复选框,参数为True,False |
clickable | 可点击的元素,参数为True,False |
longClickable | 可长按的元素,参数为True,False |
scrollable | 可滚动的元素,参数为True,False |
enabled | 已激活的元素,参数为True,False |
focusable | 可聚焦的元素,参数为True,False |
focused | 获得了焦点的元素,参数为True,False |
selected | 当前选中的元素,参数为True,False |
packageName | packageName为指定包名的元素 |
packageNameMatches | packageName为符合正则的元素 |
resourceId | resourceId为指定内容的元素 |
resourceIdMatches | resourceId为符合指定正则的元素 |
对于元素的定位还支持:
1.子元素定位
2.兄弟定位
3.相对定位
4.XPATH定位等
八、视频效果
点击这里查看视频效果。
视频链接地址:
https://xml-test01.oss-cn-shanghai.aliyuncs.com/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2%E8%B5%84%E6%96%99/20221022_110858.mp4
本文作者:夏明亮
转载请标注出处:https://blog.51cto.com/mlxia