文章插图
1. 前言群控 , 相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作 , 更多的人喜欢把它和 Hui 产绑定在一起!
事实上 , 群控在自动化测试中也被广泛使用! 接下来的几篇文章 , 我将带大家聊聊 企业 级自动化中 , 群控 正确的使用姿势!
本篇先从基础篇开始 , 聊聊使用 「 Python + adb 」 命令如何编写一套群控脚本
2. 准备在本机安装 Android 开发环境 , 保证 adb 被添加到环境变量
将准备好的多台设备 , 使用数据线( 或者通过 Hub )连接到电脑上
通过 adb devices 命令查看已经连接的所有设备
# 下面显示连接了3台设备xag:Test xingag$ adb devicesList of devices attached822QEDTL225T7deviceca2b3455deviceDE45d9323SE96device
3. 实战自动化群控以闲鱼 App 的一次关键字搜索为例 , 步骤包含:打开应用、点击到搜索界面、输入内容、点击搜索按钮下面通过 7 步来完成这一操作
1、获 取目标应用的包名及初始化 Activity
获取方式有很多种 , 主流方式包含:adb 命令、解析 APK、第三方 APK、 无障碍服务
这里推荐使用 adb 命令这种方式
# 获取当前运行应用的包名及初始Activityadb shell dumpsys activity | grep -i run
打开闲鱼 App , 在命令终端输入上面的命令 , 终端会将包名及 Activity 名称显示出来文章插图
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 devices
3、群控打 开目标应用遍历设备列表 , 使用 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 文件 , 利用正则表达式得到目标控件的坐标值
- 计算出控件的中心点坐标
文章插图
利用控件 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
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |智点菁教育:副业热潮,职场人争做“斜杠青年”
- 职业教育|新职业教育法5月实行,行业迎来黄金发展期,企业估值修复有望
- 教师|父母眼中的“铁饭碗”,我们应该听从吗?应该认可吗?
- 篮球技术有哪些
- 觉农舜毫的栽培技术,教你几招冷藏后的茶叶如何提香
- 一文读懂神经网络的奥妙
- 手机视频如何添加文字?原来这么简单,手把手教你一分钟搞定
- Python之爬虫入门教程
- AI人工智能:JAVA教你拍照识别文字 并语音播报
- 全民国家安教育日是哪一天?