Python实现Android自动化测试:uiautomator2与ADB实战 1. Python操控手机APP的核心原理与工具选型用Python控制手机APP本质上是通过自动化测试框架实现的跨进程通信。目前主流的方案是通过Android Debug BridgeADB协议与uiautomator2框架的组合来实现。这套方案的优势在于无需root手机支持所有Android 4.4设备可以精准定位UI元素支持图像识别辅助定位核心工具链包含ADB工具负责建立PC与手机之间的通信桥梁uiautomator2Python封装库提供面向对象的APIWeditor可视化元素定位工具OpenCV可选用于图像识别辅助定位注意部分国产手机需要单独开启USB调试权限通常在开发者选项的USB调试安全设置中2. 环境搭建全流程2.1 基础环境准备# 安装Python3.7环境 brew install python # MacOS choco install python # Windows # 验证安装 python --version pip --version2.2 驱动安装指南不同手机品牌需要不同的USB驱动小米Mi PC Suite包含完整驱动华为HiSuite套件OPPO/VIVO需官网下载专属驱动三星Smart Switch软件安装后执行adb devices正常应显示已连接的设备序列号2.3 Python库安装pip install -U uiautomator2 weditor pillow opencv-python初始化设备连接import uiautomator2 as u2 # 通过USB连接 d u2.connect() # 通过WiFi连接需先USB连接执行adb tcpip 5555 d u2.connect(192.168.1.100:5555)3. 元素定位实战技巧3.1 基础定位方式# 通过resourceId定位 d(resourceIdcom.tencent.mm:id/b4m).click() # 通过文本定位 d(text发现).click() # 通过类名定位 d(classNameandroid.widget.TextView).click() # 组合定位 d(classNameandroid.widget.Button, textStartsWith登)3.2 高级定位策略相对定位示例# 找到微信文本下方的按钮 d(text微信).below(classNameandroid.widget.Button).click()多条件筛选# 选择第3个匹配元素 d(text朋友圈, instance2).click()动态等待# 等待最多10秒直到元素出现 d(text加载中).wait(timeout10)4. 常用操作封装4.1 基础动作库def long_click(element, duration1): element.long_click(durationduration) def swipe_up(d, times1): for _ in range(times): d.swipe(0.5, 0.8, 0.5, 0.2, 0.5) def input_text(element, text, clearTrue): if clear: element.clear_text() element.send_keys(text)4.2 特殊场景处理弹窗监控def handle_popup(d): if d(textContains允许).exists: d(textContains允许).click() elif d(textContains确定).exists: d(textContains确定).click()权限请求自动化def grant_all_permissions(d): while True: if d(textContains允许).exists: d(textContains允许).click() elif d(textContains始终允许).exists: d(textContains始终允许).click() else: break5. 实战案例微信自动化5.1 登录流程实现def wechat_login(d, username, password): d.app_start(com.tencent.mm) d(text我).click() d(text设置).click() d(text退出登录).click() d(text退出).click() d(text登录).click() d(resourceIdcom.tencent.mm:id/b4m).send_keys(username) d(resourceIdcom.tencent.mm:id/b4n).send_keys(password) d(text登录).click() handle_popup(d)5.2 朋友圈自动点赞def auto_like(d, max_swipe5): d(text发现).click() d(text朋友圈).click() for _ in range(max_swipe): for like in d(resourceIdcom.tencent.mm:id/ef3): if not like.exists: continue like.click() if d(text取消).exists: print(已点赞) else: print(新点赞) swipe_up(d)6. 性能优化技巧6.1 元素缓存策略# 错误示范每次重新查找 for _ in range(10): d(text刷新).click() # 正确做法缓存元素 refresh_btn d(text刷新) for _ in range(10): refresh_btn.click()6.2 智能等待方案from time import sleep def smart_wait(d, condition, timeout10, interval0.5): elapsed 0 while elapsed timeout: if condition(d): return True sleep(interval) elapsed interval return False7. 常见问题排查指南问题现象可能原因解决方案设备未识别USB调试未开启检查开发者选项元素定位失败页面未加载完成增加等待时间点击无效元素被遮挡使用force_click参数脚本卡死弹窗未处理添加异常捕获内存泄漏未释放连接定期重启adb服务8. 进阶开发方向8.1 图像辅助定位import cv2 def find_image_and_click(d, template_path): screenshot d.screenshot(formatopencv) template cv2.imread(template_path) res cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc cv2.minMaxLoc(res) if max_val 0.8: x, y max_loc w, h template.shape[1], template.shape[0] d.click(x w//2, y h//2)8.2 多设备协同控制from concurrent.futures import ThreadPoolExecutor def multi_device_task(devices): def task(device): d u2.connect(device) d.app_start(com.tencent.mm) with ThreadPoolExecutor() as executor: executor.map(task, devices)在实际项目中建议将常用操作封装成Page Object模式。例如创建WeChatPage类封装所有微信相关操作这样既能提高代码复用率也便于后期维护。遇到国产ROM的兼容性问题时可以尝试开启强制使用布局边界的开发者选项来辅助调试