基础要素
一、编程四要素
数据的类型
转义符
运算符
数据类型转换
变量、数组和字典
标识符命名规则
二、Python脚本利用adb进行手机控制
1、adb相关命令
1.关闭adb服务:adb kil-server
2.启动adb服务 adb start-server
3.查询当前运行的所有设备 adb devices
4.可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行 -s 虚拟设备名称
5.重启设备 adb reboot --指定虚拟设备 adb -s 设备名称 reboot
6.査看日志 adb logcat 清除日志 adb logcat -c
7.进入inux shell下 adb shel 其中常用的linux命令 cd cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了
8.传入文件到设备中 adb push 本地文件 远程目录
9.从设备中拷贝文件到本地 adb -s emulator-5556 pull /data/config.ini d:
10.显示当前运行的全部模拟器:adb devices
11. 安装应用程序:
adb install -r 123.apk
12.获取模拟器中的文件:
adb pull <remote> <local>
13.向模拟器中写文件:
adb push <local><remote>
14.进入模拟器的shell模式:
adb shell
15.卸载apk包:
adb shell
cd data/app
rm 123.apk
exit
adb uninstall 123.apk
adb install -r 123.apk
16.查看adb命令帮助信息:
adb help
17.删除系统应用:
adb remount (重新挂载系统分区,使系统分区重新可写)。
adb shell
cd system/app
rm 123.apk
18.获取管理员权限:
adb root
19、复制文件:
复制一个文件或目录到设备
adb push<source><destination></destination></source >
如:adb push update.zip /sdcard/
从设备上复制一个文件或目录:
adb pull <source><destination></destination></source>
如: adb pull /sdcard/update.zip.
20、取得当前运行设备的实例的列表及每个实例的状态:
adb devices
21:、adb shell input tap
这条命令模拟Android手机在屏幕坐标(XY)处进行了点击操作。
22、adb shell input swipe
这条命令模拟Android手机从屏幕坐标(X1,Y1)滑动到坐标(X2,Y2)的操作。
23、uiautomator dump dump: creates an XML dump of current Ul hierarchy 这个命令是用来成成当前界面的UI层次,并用XML格式进行展示。这样就可以获取各个组件的位置了。
注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s
例:adb -s 13b6e4c4 shell input tap 400 400
表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置进行模拟的点击事件。
24、能看到设备信息就代表设备已经连接成功了,接下来的命令就是adb install 路径+包名.apk
例如我的安装包放在桌面,那么命令就是adb install C:Users\hyhiDesktop\XxX.apk
*** adb shell uiautomator dump /mnt/sdcard/window_dump.xml 获得手机当前界面的UI信息,生成window_dump.xml
*** adb shell input text“123”输入text
举例:
1.打开cmd,进入当前文件夹中,输入命令adb devices查看当前与电脑连接的设备(前提是手机打开usb调试模式),可以查看已成功连接的手机
2.若手机成功连接,输入命令adb shell input tap 100 100,表示点击屏幕上坐标为(100,100)的点,如果不知道需要点击的点的具体位置的话可以在手机开发者模式中设置
2、adb模拟按键
1.比如使用 adb shell input keyevent < keycode >命令,不同的keycode能实现不同的功能,完整的keycode列表详见KeyEvent,摘引部分内容如下:
2.input命令的一切用法举例:
电源键 命令:
1. adb shell input keyevent 26 //执行效果相当于按电源键
菜单 命令:
1. adb shell input keyevent 82
HOME 命令:
1. adb shell input keyevent 3
3、使用python脚本自动运行cmd命令
1.在adb文件夹下建立一个python文件
import os
os.system('adb shell input tap 100 100');
运行脚本,发现与在命令行输入相同语句有同样的效果
2.也可以使用subprocess.Popen,最简单使用方式如下,设置shell = True, 就不会弹出cmd框
process = subprocess.Popen('adb shell input tap 14 1402', shell = True)
程序实例:
#coding:utf-8
#程序功能:可以实现抖音个人页面视频的自动点击,从而自动增加访问量
#思路:抖音主页中两个视频切换点击,可以实现访问量的增加
#使用ADB程序,视频的屏幕坐标可以使用adb shell uiautomator dump命令,获取该页面xml源码后查得
#下述是小米MIX2抖音主页第一个视频和第二个视频的坐标位置
#缺点:运行时不能移动屏幕,后续可以采用获取模块ID号的方式去点击相应的位置
import time
import subprocess
i = 0
#每次操作的间隔时间取决于手机配置,配置越高时间越短
sleep_time = 0.5
while 1:
#用popen设置shell=True不会弹出cmd框
process = subprocess.Popen('adb shell input tap 14 1402',shell=True)
time.sleep(sleep_time)
process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True)
time.sleep(sleep_time)
process = subprocess.Popen('adb shell input tap 375 1402', shell=True)
time.sleep(sleep_time)
process = subprocess.Popen('adb shell input keyevent KEYCODE_BACK', shell=True)
time.sleep(sleep_time)
#os.system('adb shell input tap 14 1402')
#os.system('adb shell input keyevent KEYCODE_BACK')
#os.system('adb shell input tap 375 1402')
i+=1
print str(i) + 'clicks have been completed'
实现原理:
Hierarchy Viewer:获得当前手机实时的UI信息,方便用于手机的自动化测试;
python中的subprocess.Popen() 或 Python os模块:调用系统命令;
uiautomator工具:获取界面控件信息;
adb命令:对手机进行操作;
三、如何使用Python控制手机(一)
1.配置Python环境变量
百度Anaconda并且下载安装,安装过程中可直接选择自动配置环境变量
2.安装Python编辑器,在其中配置Python
编辑器常用的是PyCharm
3.安装控制包uiautomator2,和其它辅助包
# GitHub地址:
# https://github.com/openatx/uiautomator2
pip install uiautomator2 # 这个包是用于控制手机
pip install pillow # 这个包用于截图
pip install -U weditor # 这个包是可以调试,在浏览器页面上直观的获取某个控件名称
4.安装adb
adb全称叫做android调试桥(Android Debug Bridge),是Android官方谷歌公司开发的连接电脑与手机的插件,一般来说是包含在Android Studio之中下载的,当然我们在此处用不到Studio的其它功能,因此只下载adb包即可。
下载链接如下:
https://developer.android.google.cn/tools/releases/platform-tools?hl=zh_cn
这个链接下载的名称叫做Platform Tools,其中是包含adb工具的,其名称为adb.exe,与之相关的还有几个以ADB开头名称的文件。将此压缩包解压之后,放在系统的任意位置,然后将此位置加入Path环境变量即可。这样我们就可以在系统的任意位置调用到此exe文件。
5.adb调用
将手机通过USB数据线连接至电脑,打开开发者模式,并开启USB调试,并且开启允许电脑通过USB向手机安装软件等权限。接收电脑发来的链接秘钥并链接。
(使用Python包uiautomator2控制手机时,需要在手机上安装app)
在电脑中使用WIN+R弹出运行框,在框内输入cmd调用命令行窗口。在窗口中输入如下命令:
adb devices
窗口会打印当前USB所连接手机的信息,如果没有手机连接,将会显示如下信息,这是需要检查手机连接的USB线是否正常,并且检查开发者模式是否打开等等。当然如果直接报错找不到adb命令,则需要检查adb相关配置是否完成。
C:\Users\Administrator>adb devices
List of devices attached
C:\Users\Administrator>|
如果完全正常,且手机已经链接,则将会显示如下信息:
C:\Users\Administrator>adb devices
List of devices attached
9phqaetw device
afdsaf4 device
C:\Users\Administrator>|
在List of devices attached这一行之后,有几行信息,便说明已经有几个设备已经链接到ADB调试桥,而在每一行开头,device之前的那一串字符串,便是设备的标志码。通过设备的标志码,我们就可以链接到指定的设备,当然如果本台电脑上只链接有一块手机,此标志码可以不记,如果链接有多块手机,则需要记录每一个标志码,以及标志码对应的实际手机设备。
如果不知道哪个标志码对应哪台设备,则可以将其中一个USB拔出,再输入命令,反复查看,以此确认标志码与设备之间一一对应的关系。
6.设备安装ATX
在命令行执行如下命令,在手机上安装ATX软件。如果手机上没有安装此APP,uiautomator2将无法控制手机。
python -m uiautomator2 init
7.编写Python代码进行控制手机
比较简单的控制方式是:
# 引用uiautomator2包
import uiautomator2 as u2
# 使用设备唯一标志码链接设备,其中9phqaetw是通过adb获取的设备标志码
d = u2.connect('9phqaetw')
# d = u2.connect() # 当前只有一个设备时可以用这个
d.unlock() # 解锁屏幕
x,y = 100,100
d.click(x,y) # 点击屏幕坐标为 x,y 的点
# 双击屏幕
d.double_click(x,y)
# 长按
d.long_click(x,y)
# 单机屏幕上字符为9的控件
d(text="9").click()
例如我们写一个比较简单的解锁屏幕代码,假设锁屏密码是486570:
# 引用uiautomator2包
import uiautomator2 as u2
import time
# 使用设备唯一标志码链接设备,其中9phqaetw是通过adb获取的设备标志码
d = u2.connect('9phqaetw')
# d = u2.connect() # 当前只有一个设备时可以用这个
d.unlock() # 解锁屏幕
time.sleep(2) # 等待手机反应2秒钟
# 锁屏密码
password = "486570"
# 输入锁屏密码
for c in password:
d(text=c).click()
time.sleep(0.3) # 间隔0.3秒单击一次屏幕
8.weditor调试工具
weditor用于查看手机当前状态、用浏览器控制手机、调试手机,还可以实时的查找控件中的text属性以及其它属性值等等。
第一种打开方式是在命令窗口输入:
python -m weditor
第二种方式是在桌面创建快捷方式,在命令窗口输入:
weditor --shortcut
在桌面会自动创建一个名为WEditor的图标,双击即可。
打开weditor后会出现一个信息调试框,并且会自动打开默认浏览器跳转至调试页面,关闭调试框和浏览器页面其中任一个,weditor即被关闭。注意如果默认浏览器为IE的话,不知道支持与否,或可自行尝试。
在顶部可以切换静态调试还是实时,如果是实时情况下,则会跟随手机进行实时界面切换。
四、如何使用Python控制手机(二)
1.打开APP
当我们使用uiautomator2包来打开某个APP时,可以通过点击屏幕特殊位置的方式来实现。但是其中存在的问题便是,可能由于我们APP图标的移动,而使得程序无法运行。健壮性和通用性不高。
其实在uiautomator2这个包中,提供了一种可以通过APP包名就可以打开特定APP的方式,例如打开和关闭淘宝。
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
d.app_start("com.taobao.taobao") # 打开淘宝
time.sleep(10) # 等待10秒钟
d.app_stop("com.taobao.taobao") # 关闭淘宝
再比如打开和关闭微信:
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
d.app_start("com.tencent.mm") # 打开微信
time.sleep(10) # 等待10秒钟
d.app_stop("com.tencent.mm") # 关闭微信
2.获取APP的包名
有的时候,我们是不太清楚一个APP的包名的,这时我们可以通过打印设备当前信息的方式来获取APP的包名。首先我们需要将要获取的APP打开,并且保持在手机最前台
执行代码:
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
print(d.info) # 打印设备信息
输出结果如下:
{'currentPackageName': 'com.taobao.taobao', 'displayHeight': 2111, 'displayRotation': 0, 'displaySizeDpX': 393, 'displaySizeDpY': 851, 'displayWidth': 1080, 'productName': 'cannon', 'screenOn': True, 'sdkInt': 29, 'naturalOrientation': True}
Process finished with exit code 0
在所打印的Json键值对中,键currentPackageName对应的值,即为此时正在最前台的APP的包名,上述结果操作时,正在最前的APP为淘宝。
3.打开特定界面
一般来说,如果页面切换按钮有特定文字,我们直接通过文字进行定位是最方便的,也是最准确的,比如打开 微信朋友圈 :
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
d.app_start("com.tencent.mm") # 打开微信
time.sleep(2) # 等待2秒钟
d(text='发现').click() # 点击文字为“发现”的控件
time.sleep(2) # 等待2秒钟
d(text='朋友圈').click() # 点击文字为“朋友圈”的控件
因为可能存在的,APP的加载时间和对点击操作的响应时间,尽量在每次点击操作之后,为APP和手机留有足够的反应时间。值得注意的是,如果打开微信之后,恰好有个常用联系人的昵称叫做“发现”,那就可能会被误点,这种情况下我们需要使用别的定位方式来定位特定控件。
需要点击的文字如果是固定的,就可以使用d(text=“XXX”)来选择控件元素,其中XXX为特定的文字。如果部分文字是固定的,比如第一次元素显示文字为“我是第11932位访客”,第二次显示文字为“我是第12111位访客”,那我们可以通过d(textContains=“我是第”).click()来点击这个控件,或者通过d(textContains=“位访客”).click()来点击这个控件,这种方式就可以通过子字符串来定位特定的元素控件。
还是使用进入朋友圈来举例:
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
d.app_start("com.tencent.mm") # 打开微信
time.sleep(2) # 等待2秒钟
# 点击“发现”,三选一
d(text='发现').click() # 点击文字为“发现”控件
d(textContains='发').click() # 点击带“发”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="com.tencent.mm:id/e8y"]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[3]/android.widget.LinearLayout[1]').click()
time.sleep(2) # 等待2秒钟
# 点击“朋友圈”,三选一
d(text='朋友圈').click() # 点击文字为“朋友圈”控件
d(textContains='朋').click() # 点击带“朋”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="android:id/list"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()
其实还有很多各不相同的定位方式,只要能定位到唯一的特定的控件进行点击即可。例如在双十一时,我在淘宝中切换到收集喵币页面的点击事件:
import uiautomator2 as u2
import time
d = u2.connect() # 连接设备
d.app_start("com.taobao.taobao") # 打开淘宝
time.sleep(5) # 等待5秒钟
d.xpath('//*[@content-desc="双11超级喵糖"]').click() # 打开喵糖页面
4.总结
关于按键:
d.press("home") # 点击home键
d.press("back") # 点击back键
d.press("left") # 点击左键
d.press("right") # 点击右键
d.press("up") # 点击上键
d.press("down") # 点击下键
d.press("center") # 点击选中
d.press("menu") # 点击menu按键
d.press("search") # 点击搜索按键
d.press("enter") # 点击enter键
d.press("delete") # 点击删除按键
d.press("recent") # 点击近期活动按键
d.press("volume_up") # 音量+
d.press("volume_down") # 音量-
d.press("volume_mute") # 静音
d.press("camera") # 相机
d.press("power") # 电源键
关于锁屏与解锁:
# 一个设备信息字典中的布尔值,为true时代表当前屏幕亮起,为false代表当前屏幕熄灭
d.info.get('screenOn')
# 仅点亮屏幕
d.screen_on()
# 点亮屏幕并解锁,注意如果有密码,则只能进入密码输入页面,需要输入密码才能解锁
d.unlock()
# 关闭屏幕
d.screen_off()
关于点击等操作(支持百分比):
# 单击屏幕
d.click(x,y) # x,y为点击坐标
# 双击屏幕
d.double_click(x, y)
d.double_click(x, y, 0.1) # 默认两个单击之间间隔时间为0.1秒
# 长按
d.long_click(x, y)
d.long_click(x, y, 0.5) # 长按0.5秒(默认)
# 滑动
d.swipe(sx, sy, ex, ey)
d.swipe(sx, sy, ex, ey, 0.5) # 滑动0.5秒(默认)
#拖动
d.drag(sx, sy, ex, ey)
d.drag(sx, sy, ex, ey, 0.5) # 拖动0.5秒(默认)
# 滑动点 多用于九宫格解锁,提前获取到每个点的相对坐标(这里支持百分比)
# 从点(x0, y0)滑到点(x1, y1)再滑到点(x2, y2)
# 两点之间的滑动速度是0.2秒
d.swipe((x0, y0), (x1, y1), (x2, y2), 0.2)
# 注意:单击,滑动,拖动操作支持百分比位置值。例:
d.long_click(0.5, 0.5) 表示长按屏幕中心
d(scrollable=True).scroll.to(text="3年级2班") 表示:向上滑动屏幕,直到指定文字出现为止