Python自动化测试实战:用ADB控制安卓手机模拟用户行为(以刷视频App为例)

张开发
2026/4/18 12:36:37 15 分钟阅读

分享文章

Python自动化测试实战:用ADB控制安卓手机模拟用户行为(以刷视频App为例)
Python自动化测试实战从刷视频到掌握ADB控制安卓设备在移动互联网时代自动化测试已成为保证App质量的关键技术。而学习自动化测试最好的方式就是从实际场景入手。本文将从一个有趣的角度——自动刷视频带你深入理解Android设备控制的核心技术ADBAndroid Debug Bridge并学会用Python构建自动化测试脚本。1. 环境准备与ADB基础1.1 搭建开发环境要开始Android自动化测试之旅我们需要准备以下工具Python 3.8推荐使用最新稳定版PyCharm Community Edition轻量级Python IDEADB工具包Android SDK Platform-Tools的一部分安卓手机系统版本5.0以上开启开发者模式安装完成后验证ADB是否配置成功adb version如果看到版本号输出说明环境配置正确。接下来连接手机adb devices成功连接后设备列表中会显示你的手机序列号。1.2 ADB基础命令解析ADB提供了丰富的设备控制命令其中input命令族特别适合模拟用户操作命令格式功能描述示例adb shell input tap x y模拟点击屏幕坐标adb shell input tap 500 1000adb shell input swipe x1 y1 x2 y2模拟滑动操作adb shell input swipe 300 1600 300 800adb shell input text string输入文本adb shell input text helloadb shell input keyevent code发送按键事件adb shell input keyevent 4(返回键)提示获取屏幕坐标可以使用adb shell getevent -l命令或开启手机开发者选项中的指针位置功能。2. Python控制ADB的核心技巧2.1 使用subprocess模块调用ADBPython的subprocess模块是与系统命令交互的最佳方式。下面是一个封装ADB命令的基础类import subprocess import time class ADBController: def __init__(self, device_idNone): self.device_id device_id def run_adb(self, command): full_cmd fadb {f-s {self.device_id} if self.device_id else } {command} try: result subprocess.run( full_cmd, shellTrue, checkTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE, textTrue ) return result.stdout.strip() except subprocess.CalledProcessError as e: print(f命令执行失败: {e.stderr}) return None def tap(self, x, y): return self.run_adb(fshell input tap {x} {y}) def swipe(self, x1, y1, x2, y2, duration300): return self.run_adb(fshell input swipe {x1} {y1} {x2} {y2} {duration})2.2 实现智能刷视频逻辑单纯的固定间隔滑动缺乏真实感我们可以加入随机性和智能判断import random from datetime import datetime class VideoWatcher(ADBController): def __init__(self, device_idNone): super().__init__(device_id) self.watch_count 0 self.start_time datetime.now() def random_swipe(self): # 随机生成滑动参数 x random.randint(100, 500) y1 random.randint(800, 1600) y2 random.randint(300, 700) duration random.randint(200, 500) self.swipe(x, y1, x, y2, duration) self.watch_count 1 # 随机观看时长 watch_time random.uniform(8.0, 15.0) time.sleep(watch_time) current_time datetime.now() - self.start_time print(f[{current_time}] 已观看 {self.watch_count} 个视频本次观看 {watch_time:.1f} 秒)3. 从刷视频到自动化测试的思维转换3.1 理解自动化测试的核心要素刷视频只是ADB能力的简单展示真正的自动化测试需要考虑更多因素元素定位通过UI Automator或XPath定位界面元素状态验证检查页面元素或系统属性确认操作结果异常处理网络中断、弹窗处理等边界情况测试报告记录测试过程和结果3.2 构建完整的测试用例以视频App为例一个完整的测试用例可能包含启动测试验证App能否正常启动权限检查处理各种系统权限弹窗核心功能测试视频播放/暂停点赞/收藏操作评论功能分享流程性能监测记录CPU、内存占用清理工作测试完成后重置状态class VideoAppTester(VideoWatcher): def test_video_interaction(self): # 测试点赞功能 self.tap(900, 1800) # 点赞按钮坐标 time.sleep(1) # 验证是否点赞成功需要根据实际UI调整 screenshot self.run_adb(shell screencap -p /sdcard/screen.png) self.run_adb(fpull /sdcard/screen.png ./screenshots/like_{int(time.time())}.png) # 测试评论功能 self.tap(800, 1850) # 评论按钮 time.sleep(2) self.run_adb(shell input text 自动化测试评论) self.run_adb(shell input keyevent 66) # 回车键 time.sleep(3)4. 高级技巧与实战优化4.1 多设备并行控制当需要测试多台设备时可以扩展我们的控制器class MultiDeviceManager: def __init__(self): self.devices self._get_devices() self.controllers [ADBController(device) for device in self.devices] def _get_devices(self): result subprocess.run(adb devices, shellTrue, stdoutsubprocess.PIPE, textTrue) lines result.stdout.splitlines()[1:] # 跳过第一行标题 return [line.split(\t)[0] for line in lines if line.strip()] def run_on_all(self, func, *args, **kwargs): from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: futures [ executor.submit(func, controller, *args, **kwargs) for controller in self.controllers ] return [f.result() for f in futures]4.2 结合OCR提升测试可靠性对于动态变化的UI元素可以集成OCR技术import pytesseract from PIL import Image class OCREnhancedTester(ADBController): def get_text_from_screen(self, regionNone): # 截屏并保存 self.run_adb(shell screencap -p /sdcard/temp.png) self.run_adb(pull /sdcard/temp.png ./temp.png) # 处理图像 img Image.open(./temp.png) if region: img img.crop(region) # (left, top, right, bottom) # OCR识别 text pytesseract.image_to_string(img, langchi_simeng) return text.strip() def wait_for_text(self, target_text, timeout10, interval1): start time.time() while time.time() - start timeout: current_text self.get_text_from_screen() if target_text in current_text: return True time.sleep(interval) return False4.3 性能监控与优化自动化测试不仅要关注功能还要监测性能表现class PerformanceMonitor(ADBController): def get_cpu_usage(self, package_name): cmd fshell top -n 1 | grep {package_name} result self.run_adb(cmd) if result: parts result.split() return float(parts[8]) # CPU使用百分比 return 0 def get_memory_usage(self, package_name): cmd fshell dumpsys meminfo {package_name} | grep TOTAL result self.run_adb(cmd) if result: return int(result.split()[1]) # KB return 0 def monitor_performance(self, package_name, duration60, interval5): data [] end_time time.time() duration while time.time() end_time: cpu self.get_cpu_usage(package_name) memory self.get_memory_usage(package_name) timestamp datetime.now().strftime(%H:%M:%S) data.append({ time: timestamp, cpu: cpu, memory: memory }) time.sleep(interval) return data掌握这些技术后你会发现自动刷视频只是ADB应用的冰山一角。真正的价值在于将这些技术应用到App功能测试、兼容性测试和性能测试等专业领域为开发高质量移动应用提供可靠保障。

更多文章