教你用10行Python 代码实现自动化群控


教你用10行Python 代码实现自动化群控

文章插图
 
1. 前言群控 , 相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作 , 更多的人喜欢把它和 Hui 产绑定在一起!
事实上 , 群控在自动化测试中也被广泛使用! 接下来的几篇文章 , 我将带大家聊聊 企业 级自动化中 , 群控 正确的使用姿势!
本篇先从基础篇开始 , 聊聊使用 「 Python + adb 」 命令如何编写一套群控脚本
2. 准备在本机安装 Android 开发环境 , 保证 adb 被添加到环境变量
将准备好的多台设备 , 使用数据线( 或者通过 Hub )连接到电脑上
通过 adb devices 命令查看已经连接的所有设备
# 下面显示连接了3台设备xag:Test xingag$ adb devicesList of devices attached822QEDTL225T7deviceca2b3455deviceDE45d9323SE96device3. 实战自动化群控以闲鱼 App 的一次关键字搜索为例 , 步骤包含:打开应用、点击到搜索界面、输入内容、点击搜索按钮
下面通过 7 步来完成这一操作
1、获 取目标应用的包名及初始化 Activity
获取方式有很多种 , 主流方式包含:adb 命令、解析 APK、第三方 APK、 无障碍服务
这里推荐使用 adb 命令这种方式
# 获取当前运行应用的包名及初始Activityadb shell dumpsys activity | grep -i run打开闲鱼 App , 在命令终端输入上面的命令 , 终端会将包名及 Activity 名称显示出来
教你用10行Python 代码实现自动化群控

文章插图
 
2、获取 所有在线的设备
通过 adb devices 命令 , 通过输出内容 , 进行一次过滤 , 得到所有连接到 PC 端的设备
# 所有设备IDdevices = []def get_online_devices(self):"""获取所有在线的设备:return:"""global devicestry: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 devices3、群控打 开目标应用
遍历设备列表 , 使用 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)4、封装 执行步骤
为了方便管理设备 , 将每一步的操作写入到 YAML 文件中 , 可以 通过 ID 查找元素并执行点击操作、在输入框中输入内容、调用本地方法及输入参数
这里分别对应: 保存 UI 输入键、查找输入框元素并执行点击操作、保存 UI 树控件(界面变化了)、输入文本内容、查看搜索按钮元素并执行点击操作
# steps_adb.yaml# 包名和Activitypackage_name:com.taobao.idlefishhome_activity:com.taobao.fleamarket.home.activity.InitActivity# 执行步骤steps:- save_ui_tree_to_local:method:save_ui_tree_to_localargs:- 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 文件 , 利用正则表达式得到目标控件的坐标值
  • 计算出控件的中心点坐标

教你用10行Python 代码实现自动化群控

文章插图
 
利用控件 ID 获取元素中心点坐标的实现代码如下:
def get_element_position(element_id, uidump_name):"""通过元素的id , 使用ElementTree , 解析元素控件树 , 查找元素的坐标中心点:param element_id: 元素id , 比如::return: 元素坐标"""# 解析XMLtree = ET.parse('./../%s.xml' % uidump_name)root = tree.getroot()# 待查找的元素result_element = None# print('查找数目', len(root.findall('.//node')))# 遍历查找node元素# 通过元素idfor node_element in root.findall('.//node'):if node_element.attrib['resource-id'] == element_id:result_element = node_elementbreak# 如果找不到元素 , 直接返回空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


推荐阅读