当前位置: 首页 > news >正文

告别手动点点点!用Python+Appium+网易MuMu模拟器实现安卓App自动化测试(保姆级环境配置)

从零构建安卓自动化测试:Python+Appium+MuMu模拟器全流程指南

每次手动测试App时,你是否也厌倦了那些重复的点击、滑动和验证?作为一名曾经的"手工测试劳工",我完全理解这种痛苦。直到发现Python+Appium这套自动化组合拳,才真正从机械劳动中解放出来。本文将带你完整走通环境搭建到脚本编写的全流程,特别针对Windows平台下使用网易MuMu模拟器的各种"坑"给出解决方案。

1. 环境准备:搭建自动化测试基石

自动化测试的环境配置就像盖房子的地基,一步错可能导致后续满盘皆输。我们需要准备的软件清单如下:

  • Java开发工具包(JDK):Appium基于Java开发,必须安装JDK 8或以上版本
  • Android SDK:包含adb等关键工具,建议下载Android Studio后通过SDK Manager安装
  • Python 3.7+:我们的脚本语言环境,推荐使用最新稳定版
  • Appium Desktop:可视化服务端工具,比命令行版本更友好
  • Node.js:Appium的运行时环境
  • 网易MuMu模拟器:轻量级安卓模拟器,对电脑配置要求较低

安装完成后,需要配置几个关键环境变量:

变量名值示例作用说明
JAVA_HOMEC:\Program Files\Java\jdk指定JDK安装位置
ANDROID_HOMEC:\Android\Sdk指向Android SDK目录
Path%JAVA_HOME%\bin添加Java和adb到系统路径

提示:验证环境变量是否生效,可以在命令行分别执行java -versionadb versionpython --version查看输出。

2. MuMu模拟器特殊配置:解决adb连接难题

MuMu模拟器使用自定义的adb端口和二进制文件,这导致直接使用Android SDK的adb会连接失败。以下是必须执行的调整步骤:

  1. 定位MuMu安装目录下的adb.exe(通常在\emulator\nemu\vmonitor\bin
  2. 复制该文件替换Android SDK的adb(platform-tools目录下)
  3. 重启命令行窗口使更改生效

连接模拟器的关键命令序列:

adb kill-server # 终止现有adb服务 adb connect 127.0.0.1:7555 # MuMu默认监听端口 adb devices # 应显示已连接设备

常见问题排查:

  • 端口占用:执行netstat -ano | findstr "5037"查找占用进程
  • 连接超时:检查模拟器是否开启USB调试模式(设置→关于手机→连续点击版本号激活开发者选项)

3. Appium服务配置:搭建桥梁

Appium作为中间层,负责将Python脚本指令转化为模拟器可执行操作。推荐使用Appium Desktop进行可视化配置:

  1. 启动Appium Server GUI
  2. 保持默认主机(127.0.0.1)和端口(4723)
  3. 在"Edit Configurations"中设置:
    • ANDROID_HOME:你的SDK路径
    • JAVA_HOME:JDK安装路径
  4. 保存后启动服务

验证服务是否正常:

  • 访问http://localhost:4723/wd/hub/status应返回JSON格式的状态信息
  • 出现"Could not connect to server"错误时,检查Node.js版本是否兼容

4. 编写首个自动化脚本:从点击到断言

下面是一个完整的Python测试脚本模板,实现了基础操作链:

from appium import webdriver from appium.webdriver.common.touch_action import TouchAction import time desired_caps = { 'platformName': 'Android', 'deviceName': 'MuMu', # 任意命名 'platformVersion': '6.0.1', # 需与模拟器版本一致 'appPackage': 'com.example.app', # 待测App包名 'appActivity': '.MainActivity', # 启动Activity 'automationName': 'UIAutomator2', 'noReset': True # 避免每次重置App } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 元素定位与操作 login_btn = driver.find_element_by_id('com.example.app:id/login') login_btn.click() # 输入文本 username = driver.find_element_by_xpath('//android.widget.EditText[@text="用户名"]') username.send_keys('testuser') # 滑动操作 TouchAction(driver).press(x=500, y=1500).move_to(x=500, y=500).release().perform() # 验证Toast消息 toast = driver.find_element_by_xpath('//*[contains(@text, "登录成功")]') assert toast.is_displayed() driver.quit()

获取App包名和Activity的两种方法:

  1. 使用aapt工具:aapt dump badging app.apk | findstr package
  2. 运行App后执行:adb shell dumpsys window | findstr mCurrentFocus

5. 高级技巧与优化策略

当基础脚本运行稳定后,可以考虑以下进阶方案:

页面对象模式(POM)将元素定位与业务逻辑分离,创建可复用的页面类:

class LoginPage: def __init__(self, driver): self.driver = driver @property def username_field(self): return self.driver.find_element_by_id('com.example.app:id/username') def login(self, username, password): self.username_field.send_keys(username) # 其他登录步骤...

并行测试配置在desired capabilities中指定不同设备参数,配合pytest-xdist实现并行执行:

def pytest_generate_tests(metafunc): if 'device' in metafunc.fixturenames: metafunc.parametrize('device', [ {'port': 4723, 'udid': 'emulator-5554'}, {'port': 4724, 'udid': 'emulator-5556'} ])

异常处理机制增加智能等待和自动重试逻辑:

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "dynamicElement")) ) except TimeoutException: driver.save_screenshot('timeout_error.png') raise

6. 持续集成:让测试自动运行

将自动化测试接入CI/CD流水线,实现每次代码提交后的自动验证。以Jenkins为例的配置要点:

  1. 安装Python插件和Android环境插件
  2. 创建自由风格项目,添加构建步骤:
    pip install -r requirements.txt pytest tests/ --html=report.html
  3. 添加HTML报告发布配置
  4. 设置定时构建或Git钩子触发

关键优化指标监控:

  • 用例通过率
  • 平均执行时长
  • 元素定位稳定性
  • 异常截图留存率

遇到元素定位失败时,不要立即认为脚本有问题。先手动打开App,使用Appium Inspector或UI Automator Viewer确认元素属性是否变更。有时候简单的XPath调整就能解决问题,比如将//Button[@text="登录"]改为//*[contains(@text, "登")]提高容错性。

http://www.jsqmd.com/news/979653/

相关文章:

  • 从恒流源到Re:一个Multisim仿真案例,讲透差分放大电路共模抑制比(KCMR)的设计取舍
  • 多资产交易场景下网络钓鱼攻击特征与防御技术研究
  • 告别ViT单尺度!用Pyramid Vision Transformer (PVT_V1) 轻松构建多尺度特征金字塔
  • Python新手必看:用eval()和map()函数优雅处理PTA多结果计算题
  • 2025-2026年上海geo优化公司推荐:五大口碑产品评测AI获客转化市场份额价格 - 品牌推荐
  • 别再用全局变量了!用GCC的__attribute__((section))实现模块化自动初始化(附RT-Thread/OneOS源码解析)
  • 2026钛锻件技术解析:国军标钛锻件、石油用高强度钛棒、船舶用钛锻件、钛方条、钛法兰、锻件钛棒、3D打印基板、TC4钛环选择指南 - 优质品牌商家
  • 2025-2026年深成回收服务器(深圳)有限公司电话查询:企业资质与回收流程核实指南 - 品牌推荐
  • Java Web药品管理系统一键部署包:含Tomcat6环境、MySQL建库脚本与完整源码
  • 别再手动算正弦表了!用STM32CubeMX+DAC+DMA+TIM,5分钟搞定10KHz信号发生器
  • 聊城黄金回收门店实测盘点 闲置变现选店全攻略 - 润富黄金回收
  • Redis分布式锁进阶第六十二篇
  • FinalShell不只是SSH客户端:手把手教你玩转它的服务器监控、进程管理和文件可视化功能
  • 深度掌握AMD Ryzen调试:SMUDebugTool专业工具实战配置指南
  • 2026年日本红枫苗木评测:红叶李苗木、红梅苗木、绚丽海棠苗木、美国红枫苗木、银杏苗木、乌桕苗木、巨紫荆苗木、日本红枫苗木选择指南 - 优质品牌商家
  • 2025-2026年山东银凤股份有限公司电话查询:选购日用陶瓷时注意核实企业资质 - 品牌推荐
  • 钉钉H5微应用开发避坑指南:从零到发布,我踩过的那些坑(含完整代码)
  • 湛江珍宝黄金回收老店实测 - 润富黄金回收
  • GCC链接脚本玩出新花样:手把手教你用section关键字定制固件内存布局(从.map文件分析到实战)
  • MusicFree插件系统架构设计与技术实现方案
  • RAG如何精准处理高密度表格PDF?结构化解析实战
  • 2026年天津饲料原料厂家选购指南:鱼粉、鸡肉粉、进口饲料原料供应商选择指南,货源、品控、供应链三维度权威解析 - 海棠依旧大
  • 告别登录弹窗!保姆级教程:手动修改GeForce Experience文件实现永久匿名登录
  • SolidWorks模型在MATLAB里仿真总出错?可能是这5个参数设置没搞对
  • 告别手动CE修改:手把手教你用易语言编写全自动游戏注入器(支持线程/AOB/API钩子)
  • 2026建材行业脱硫脱硝一体化设备评测报告:工业湿电除尘器/干法脱硫/水泥厂玻璃钢脱硫塔/湿式湿电除尘器/湿式静电除尘器/选择指南 - 优质品牌商家
  • 别再只盯着WinCC了!盘点5个能让你眼前一亮的开源SCADA/组态项目(Qt、C#、Web全都有)
  • 威海黄金及奢侈品回收市场实测 六家门店对比 - 润富黄金回收
  • 湛江千鸿黄金回收上门实测 - 润富黄金回收
  • TI Bluetooth Logger日志分析实战:用过滤、高亮和标签功能快速定位蓝牙连接问题