1. 前言

群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操做,更多的人喜欢把它和灰产绑定在一块儿!node

事实上,群控在自动化测试中也被普遍使用!接下来的几篇文章,我将带你们聊聊企业级自动化中,群控正确的使用姿式!正则表达式

本篇先从基础篇开始,聊聊使用「 Python + adb 」命令如何编写一套群控脚本shell

2. 准备

在本机安装 Android 开发环境,保证 adb 被添加到环境变量app

将准备好的多台设备,使用数据线( 或者经过 Hub )链接到电脑上测试

经过 adb devices 命令查看已经链接的全部设备ui

# 下面显示链接了3台设备

xag:Test xingag$ adb devices

List of devices attached

822QEDTL225T7 device

ca2b3455 device

DE45d9323SE96 device

3. 实战

自动化群控以闲鱼 App 的一次关键字搜索为例,步骤包含:打开应用、点击到搜索界面、输入内容、点击搜索按钮​3d

下面经过7步来完成这一操做code

一、获取目标应用的包名及初始化 Activityorm

获取方式有不少种,主流方式包含:adb 命令、解析 APK、第三方 APK、无障碍服务xml

这里推荐使用 adb 命令这种方式

# 获取当前运行应用的包名及初始Activity

adb shell dumpsys activity | grep -i run

打开闲鱼 App,在命令终端输入上面的命令,终端会将包名及 Activity 名称显示出来

二、获取全部在线的设备

经过 adb devices 命令,经过输出内容,进行一次过滤,获得全部链接到 PC 端的设备

# 全部设备ID

devices = []

def get_online_devices(self):

"""

获取全部在线的设备

:return:

"""

global devices

try:

for device_serias_name in exec_cmd("adb devices"):

# 过滤掉第一条数据及不在线的设备

if "device" in device_serias_name:

devices.append(device_serias_name.split("\t")[0])

devices = devices[1:]

except Exception as e:

print(e)

# 连上的全部设备及数量

return devices

三、群控打开目标应用

遍历设备列表,使用 adb -s 设备ID shell am start -W 命令分别打开目标应用

def start_app(self):

"""

打开App

:return:

"""

for device in devices:

os.popen("adb -s " + device + " shell am start -W {}/{}".format(self.packageName, self.home_activity))

print('等待加载完成...')

sleep(10)

四、封装执行步骤

为了方便管理设备,将每一步的操做写入到 YAML 文件中,能够经过 ID 查找元素并执行点击操做、在输入框中输入内容、调用本地方法及输入参数

这里分别对应:保存 UI 树控件、查找输入框元素并执行点击操做、保存 UI 树控件(界面变化了)、输入文本内容、查看搜索按钮元素并执行点击操做

# steps_adb.yaml

# 包名和Activity

package_name: com.taobao.idlefish

home_activity: com.taobao.fleamarket.home.activity.InitActivity

# 执行步骤

steps:

- save_ui_tree_to_local:

method: save_ui_tree_to_local

args:

- find_element_and_click:

id: com.taobao.idlefish:id/tx_id

- save_ui_tree_to_local:

method: save_ui_tree_to_local

- input_content:

content: Python

- find_element_and_click:

id: com.taobao.idlefish:id/search_button

须要指出的是,为了提升群控的适配性,控件的实际坐标须要经过下面的步骤去获取:

导出界面的控件树

解析控件树 XML 文件,利用正则表达式获得目标控件的坐标值

计算出控件的中心点坐标

利用控件 ID 获取元素中心点坐标的实现代码以下:

def get_element_position(element_id, uidump_name):

"""

经过元素的id,使用ElementTree,解析元素控件树,查找元素的坐标中心点

:param element_id: 元素id,好比:

:return: 元素坐标

"""

# 解析XML

tree = ET.parse('./../%s.xml' % uidump_name)

root = tree.getroot()

# 待查找的元素

result_element = None

# print('查找数目', len(root.findall('.//node')))

# 遍历查找node元素

# 经过元素id

for node_element in root.findall('.//node'):

if node_element.attrib['resource-id'] == element_id:

result_element = node_element

break

# 若是找不到元素,直接返回空

if result_element is None:

print('抱歉!找不到元素!')

return None

# 解析数据

coord = re.compile(r"\d+").findall(result_element.attrib['bounds'])

# 中心点坐标

position_center = int((int(coord[0]) + int(coord[2])) / 2), int((int(coord[1]) + int(coord[3])) / 2)

return position_center

五、区分设备

为了保证群控脚本执行不会产生干扰,在每一个步骤执行以前,都应该将设备 ID 做为参数进行区分

好比:将控件的界面控件树按照设备保存为不一样的名称、点击界面和输入的命令传相应设备 ID 做为入参

​def save_ui_tree_to_local(dName):

"""

获取当前Activity控件树,保存到本地

文件名固定为:uidump.xml

:param dName: 设备id

:return:

"""

exec_cmd("adb -s %s shell uiautomator dump /data/local/tmp/%s.xml" % (dName, dName))

sleep(2)

exec_cmd("adb -s %s pull /data/local/tmp/%s.xml ./../" % (dName, dName))

六、执行步骤

从 YAML 文件中读取执行步骤,遍历步骤集合,内部遍历设备列表,以保证每个步骤,分别执行到每台设备上

# 执行步骤

for step in self.steps:

# 设备

for device in devices:

pass

接着,经过步骤名称匹配不一样的操做,便可操做设备了

​# 操做名称

step_name = list(step)[0]

if step_name == 'save_ui_tree_to_local':

# 保存UI数到本地

method = step.get(step_name).get('method')

save_ui_tree_to_local(device)

elif step_name == 'find_element_and_click':

element_id = step.get(step_name).get('id')

# 获取元素的坐标

bound_search_input = get_element_position(element_id, device)

# 点击元素

exec_cmd('adb -s %s shell input tap %s %s' % (device, bound_search_input[0], bound_search_input[1]))

elif step_name == 'input_content':

input_content = step.get(step_name).get('content')

# 模拟输入

exec_cmd('adb -s %s shell input text %s' % (device, input_content))

else:

print('其余操做步骤')

七、关闭应用

当全部的操做完成以后,一样是遍历设备,利用 adb 命令去关闭 App 便可

​def stop_all(self):

"""

关闭应用

:return:

"""

for device in devices:

os.popen("adb -s " + device + " shell am force-stop %s" % self.packageName)

4. 最后

本篇仅仅是 Python 自动化群控最简单的实现方式,后面将和你们讨论更加复杂的实现方式。

我已经将文中所有源码上传到后台,关注公众号「 AirPython 」后回复「 qk 」便可得到所有源码

若是你以为文章还不错,请你们 点赞、分享、留言下,由于这将是我持续输出更多优质文章的最强动力!

推荐阅读

python3群控手机_带你用 Python 实现自动化群控设备相关推荐

  1. python3群控手机_带你用 Python 实现自动化群控(入门篇)

    转自:AirPython 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接 ...

  2. python群控微信_带你用 Python 实现自动化群控(入门篇)

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家 ...

  3. python安卓自动化实现方法_带你用 Python 实现自动化群控(入门篇)

    原标题:带你用 Python 实现自动化群控(入门篇) 来自公众号: AirPython 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 H ...

  4. python群控_带你用 Python 实现自动化群控入门篇

    点击上方"AirPython",选择"加为星标"第一时间关注 Python 技术干货! 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完 ...

  5. 移动设备input输入框点击后自动选中内容_带你用 Python 实现自动化群控(入门篇)...

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家 ...

  6. 如何用python控制设备实现自动_带你用 Python 实现自动化群控设备

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...

  7. python群控_带你用 Python 实现自动化群控(入门篇)

    ↑关注 + 星标 ,每天学Python新技能 后台回复[大礼包]送你Python自学大礼 1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 H ...

  8. python群控手机_(干货)带你用 Python 实现自动化群控(零基础入门篇)

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家 ...

  9. python 群控源代码_自动化 带你用 Python 实现自动化群控设备 _好机友

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和 Hui 产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家 ...

最新文章

  1. [渝粤教育] 中国地质大学 自动控制原理 复习题 (2)
  2. [转载]sql server 分布式查询
  3. 编写一个C程序,实现以下功能:动态申请长度为5的整数空间数组,用户输入5个整数;动态扩展数组空间为8,用户另外输入3个整数,最后输出扩展后的全部数组元素。
  4. JS Bin Tips and Bits • About
  5. tcpdump 命令快速实用参考手册
  6. C++字符串处理封装类String
  7. iPhone 12系列全新渲染图曝光:4个“杯型” 起售价可能不到5k
  8. SAP License:雾里看花系列——SAP应用应该更关注业务过程
  9. AttributeError: module ‘matplotlib‘ has no attribute ‘image‘
  10. 万能地图下载器下载与安装教程
  11. MySQL之redo日志
  12. 贰贰许远东在浙江省社科联学术年会上关于“中小企业数字化之路”的分享
  13. Mac上超级抠图工具推荐,一键轻松解决
  14. 有时候,当我们要进入某个外网时,很慢很慢,等很久才进得去
  15. nginx配置tcp转发
  16. java基础面试题 一
  17. 【python】使用pandas快速提取腾讯问卷信息,比对未填写的人员的名单
  18. 已知三点坐标求三角形面积等几何图形学问题算法
  19. 计算机专业的就业方向有哪些,计算机专业就业方向主要有哪些?
  20. 基于遗传算法求解车辆路径问题

热门文章

  1. 货物监控设备开发中,关于EC600S和BG95模块开机方式差异的说明
  2. 一个简单的注册页面制作
  3. 探讨SEO之项目管理
  4. windows event log 错误2 的解决办法(电脑网络连接图标消失的罪魁祸首)
  5. LTE default bearer dedicated bearer and radio bearer
  6. 【机器学习之模型融合】Voting投票法简单实践
  7. 桂科版计算机工作的奥秘教案,桂科版三年级下册信息技术全册教案.pdf
  8. 树莓派 编译安装OpenCV4.1.0+opencv_contrib-4.1.0
  9. GSA 8月最新5G报告:全球已发布100台5G设备
  10. 知乎 mac apfs_APFS,Mac OS Extended(HFS +)和ExFAT之间有什么区别?