news 2026/6/17 7:29:21

5分钟上手Appium自动化测试:Python+雷电模拟器环境搭建与脚本实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5分钟上手Appium自动化测试:Python+雷电模拟器环境搭建与脚本实战

1. 项目概述与价值

看到这个标题,很多刚接触移动端自动化测试的同学可能会觉得“5分钟搞定”有点夸张,但作为一个在测试开发领域摸爬滚打了十多年的老手,我可以负责任地告诉你,只要环境搭对、思路清晰,用Python+Appium+雷电模拟器写出第一个能跑的脚本,真的就是几分钟的事。这个组合之所以被无数测试工程师和开发者青睐,核心在于它的“平民化”——你不需要昂贵的真机设备,不需要复杂的iOS证书,用一台Windows电脑和一个免费的安卓模拟器,就能搭建起完整的自动化测试环境,快速验证你的想法。

我见过太多新手卡在环境配置和第一个脚本的“Hello World”上,浪费一两天时间还跑不通,最后挫败感满满。这篇教程的目的,就是帮你绕开所有我踩过的坑,用最直白的话,把从零到一的过程掰开揉碎讲清楚。我们会聚焦于一个最经典、也最实用的场景:在雷电9模拟器上,自动化打开一个App(比如系统自带的“设置”),并点击里面的某个选项。别小看这个简单的操作,它涵盖了环境搭建、设备连接、元素定位、动作执行这自动化测试的四大基石。搞定了它,后续更复杂的滑动、输入、断言等操作,都只是在这个基础上的延伸。

2. 环境搭建:一步一坑,避坑指南

万事开头难,自动化测试的“难”十有八九出在环境上。下面这份清单是我经过无数次重装系统、配置环境后总结出来的“黄金配置”,版本都经过严格验证,能最大程度避免兼容性问题。请严格按照顺序操作。

2.1 核心三件套:Java, Android SDK, Node.js

很多人一上来就装Appium,这是错误的。Appium像一个指挥官,它需要Java、Android SDK和Node.js这三个“兵种”各司其职。

Java JDK:Appium的运行基石

  • 版本选择:不要追求最新。长期支持版本(LTS)最稳定。这里我们选择JDK 11JDK 17。我强烈推荐JDK 11,因为它在安卓自动化生态中兼容性经过了最长时间的考验。
  • 安装要点:从Oracle官网或Adoptium等开源站点下载安装包。安装路径不要有中文和空格,比如C:\Java\jdk-11就很好。
  • 环境变量配置(关键步骤)
    1. 新建系统变量JAVA_HOME,值为你的JDK安装路径,如C:\Java\jdk-11
    2. 编辑系统变量Path,添加%JAVA_HOME%\bin
  • 验证:打开命令行(CMD),输入java -version。如果正确显示版本号(如java version “11.0.xx”),说明成功。

Android SDK:与安卓设备对话的桥梁Appium本身不直接操作手机,它需要通过Android SDK提供的工具(尤其是ADB)来与模拟器或真机通信。

  • 获取方式:现在谷歌官方推荐通过Android Studio捆绑下载,但对于我们自动化测试来说,装整个Android Studio太臃肿。我推荐直接下载Android SDK Command-line Tools
    1. 访问Android开发者网站,找到“Command line tools only”进行下载。
    2. 解压到一个简单路径,例如C:\Android\cmdline-tools
    3. 你需要手动创建latest\bin的目录结构,将解压内容放入latest文件夹内。
  • 环境变量配置
    1. 新建系统变量ANDROID_HOME,值为你的SDK根目录,例如C:\Android
    2. Path变量中添加:%ANDROID_HOME%\platform-tools%ANDROID_HOME%\cmdline-tools\latest\bin
    3. 通过SDK管理器安装必要的平台工具和镜像。在命令行中,可以运行sdkmanager “platform-tools” “platforms;android-29” “emulator”来安装。这里选择Android 9(API 28/29)是因为雷电9模拟器基于此版本,兼容性好。
  • 验证:命令行输入adb version。显示版本信息即成功。

Node.js:Appium服务器的运行环境Appium是一个用Node.js写的服务器程序。

  • 版本选择:同样,选择LTS版本,如Node.js 18.x。避免使用最新的奇数版本。
  • 安装:从官网下载安装包,一路下一步即可。安装程序会自动配置环境变量。
  • 验证:命令行输入node -vnpm -v,均显示版本号即可。

注意:环境变量配置后,必须关闭所有已打开的命令行窗口,重新打开一个新的,新的环境变量才会生效。这是90%配置失败的原因。

2.2 主角登场:Appium Server与Python客户端

环境就绪,现在请出两位主角。

Appium Server:自动化指令的调度中心

  • 安装:打开新的命令行窗口,输入npm install -g appium-g代表全局安装。这个过程可能需要几分钟,取决于网络。
  • 安装驱动:Appium 2.0之后,需要单独安装驱动。对于安卓,我们安装UIAutomator2驱动:appium driver install uiautomator2
  • 启动与验证:安装完成后,在命令行输入appium。如果看到类似[Appium] Welcome to Appium v2.x.x[Appium] Appium REST http interface listener started on 0.0.0.0:4723的信息,说明服务器启动成功,正在4723端口监听。保持这个命令行窗口不要关闭

Python客户端:编写测试脚本的语言

  • 安装Python:从Python官网下载3.8-3.10版本的安装包。安装时务必勾选“Add Python to PATH”,这样就能自动配置环境变量。
  • 安装Appium客户端库:打开命令行(不是运行Appium的那个),输入pip install Appium-Python-Client。这个库提供了Python与Appium Server通信的所有接口。
  • 可选但推荐的IDE:使用VS CodePyCharm来写代码。VS Code轻量,安装Python插件即可;PyCharm功能更专一强大。任选其一。

2.3 测试舞台:雷电模拟器9

为什么是雷电9?因为它稳定、免费、性能不错,且基于Android 9,与Appium的UIAutomator2驱动兼容性极佳。

  • 下载与安装:从雷电模拟器官网下载9版本。安装路径同样避免中文和空格。
  • 关键设置(务必操作)
    1. 启动模拟器,进入系统“设置”。
    2. 找到“关于平板电脑”,连续点击“版本号”7次,开启“开发者选项”。
    3. 返回上级菜单,进入“开发者选项”,开启“USB调试”。这是ADB能够连接模拟器的关键。
  • 连接验证:打开命令行,输入adb devices。你应该能看到一个设备列表,其中包含类似emulator-5554 device的行。这表明你的电脑已经识别到了雷电模拟器。如果只看到List of devices attached下面空白,尝试重启模拟器或执行adb kill-server后再次adb start-server

3. 第一个脚本:从零到一的完整实现

环境全部绿灯,现在我们来写那个“5分钟脚本”。我们的目标是:让脚本自动打开雷电模拟器上的“设置”应用,并点击“无线和网络”选项。

3.1 获取应用关键信息:appPackage与appActivity

Appium需要知道你要操作哪个App,以及从哪个界面启动。这需要两个标识符:

  • appPackage:应用的包名,相当于身份证号。
  • appActivity:应用启动时的主活动界面,相当于家门号。

对于系统应用“设置”,我们可以用ADB命令获取:

  1. 确保雷电模拟器已启动,并停留在桌面。
  2. 命令行输入:adb shell dumpsys window | findstr mCurrentFocus
  3. 你会得到类似这样的输出:mCurrentFocus=Window{... com.android.settings/.Settings}
  4. 其中,com.android.settings就是appPackage/.Settings就是appActivity(有时是完整路径如.Settings)。

对于第三方App,如果它不在前台,可以先手动打开,再执行上述命令。也可以使用adb shell pm list packages列出所有包名来寻找。

3.2 编写核心脚本

在你的代码编辑器里,新建一个Python文件,比如first_automation.py

# 导入必要的库 from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # 1. 定义设备与应用的“期望能力”(Desired Capabilities) # 这是一组发送给Appium Server的键值对,告诉它你要如何启动会话。 desired_caps = { 'platformName': 'Android', # 平台是安卓 'platformVersion': '9', # 平台版本,雷电9一般是Android 9 'deviceName': 'emulator-5554', # 设备名,通过`adb devices`获取 'automationName': 'UiAutomator2', # 自动化引擎,Appium 2.x 必须指定 'appPackage': 'com.android.settings', # 设置应用的包名 'appActivity': '.Settings', # 设置应用的主Activity 'noReset': True, # 不重置应用状态(避免每次清除数据) 'newCommandTimeout': 600, # 命令超时时间设为600秒 } # 2. 连接Appium Server并初始化驱动(Driver) # Appium Server默认运行在本地(localhost)的4723端口 driver = webdriver.Remote('http://localhost:4723', desired_caps) # 等待2秒,让应用完全启动 time.sleep(2) # 3. 定位元素并执行操作 # 目标:点击“无线和网络”选项 # 方法:通过元素的文本内容(text)来定位 try: # 使用XPath定位,意思是:查找所有文本内容为“无线和网络”的控件 network_element = driver.find_element(AppiumBy.XPATH, '//*[@text="无线和网络"]') # 执行点击操作 network_element.click() print(“成功点击‘无线和网络’!”) except Exception as e: print(f“定位或点击元素时出错:{e}”) # 4. 等待几秒,观察结果 time.sleep(3) # 5. 关闭会话 driver.quit() print(“自动化测试脚本执行完毕!”)

3.3 逐行解析与执行

  1. 启动Appium Server:确保你在另一个命令行窗口已经运行了appium命令,并且看到4723端口监听的提示。
  2. 启动雷电模拟器:确保模拟器已开启,并处于解锁状态。
  3. 运行脚本:在你的Python文件所在目录打开命令行,输入python first_automation.py
  4. 观察现象:如果一切顺利,你会看到雷电模拟器自动打开了“设置”应用,并且自动点击进入了“无线和网络”菜单。同时,你的命令行会打印出成功的提示信息。

脚本逻辑拆解

  • webdriver.Remote:这行代码是核心,它创建了一个WebDriver对象(虽然叫WebDriver,但它用于移动端)。这个对象将你定义的desired_caps发送给本机4723端口运行的Appium Server。Appium Server根据这些信息,通过ADB连接雷电模拟器,并启动指定的App。
  • find_element:这是元素定位。我们用了XPath,//*[@text=”无线和网络”]是一个简单的XPath表达式,//表示在整个页面中查找,*表示任意类型的控件,[@text=”无线和网络”]是属性条件,即文本属性等于“无线和网络”。这是最常用的定位方式之一。
  • click():对定位到的元素执行点击操作。

4. 元素定位:自动化测试的“眼睛”

脚本能运行只是第一步,稳定可靠的元素定位才是自动化的灵魂。上面我们用到了XPath定位,但这只是其中一种方法。Appium提供了多种定位策略,你需要像侦探一样,根据现场情况选择最合适的工具。

4.1 主流定位策略详解

  1. ID/Resource-ID(首选)

    • 是什么:安卓开发中给控件定义的唯一ID,格式如com.example.app:id/button_login
    • 优点:唯一性强,定位速度最快,最稳定。
    • 用法driver.find_element(AppiumBy.ID, “com.android.settings:id/search_action_bar”)
    • 如何获取:需要借助Appium InspectorUI Automator Viewer等工具查看。
  2. Accessibility ID(内容描述)

    • 是什么:对应安卓控件的contentDescription属性,初衷是为无障碍服务设计,也常被测试用来定位。
    • 优点:对于有意义的图标按钮(如“搜索”、“返回”),开发者通常会设置,且相对稳定。
    • 用法driver.find_element(AppiumBy.ACCESSIBILITY_ID, “搜索”)
  3. XPath(万能但需谨慎)

    • 是什么:一种在XML文档中定位节点的语言。安卓的界面布局本质上是XML。
    • 优点:非常灵活,可以通过层级、属性、文本等多种方式组合定位,当其他属性都不可用时,它是最后的杀手锏。
    • 缺点:性能相对较差,容易因UI微调(如层级变化)而失效。
    • 进阶用法
      • 文本定位://*[@text=”确定”]
      • 组合属性://android.widget.TextView[@resource-id=”title” and @text=”欢迎”]
      • 层级定位://android.widget.FrameLayout/android.widget.LinearLayout/android.widget.Button[3]
  4. Class Name(类名)

    • 是什么:控件的类型,如android.widget.Button,android.widget.TextView
    • 缺点:通常一个页面有大量同类控件,不唯一。常与其他条件结合使用。
    • 用法driver.find_elements(AppiumBy.CLASS_NAME, “android.widget.Button”)[0].click()(获取第一个按钮)
  5. Android UiAutomator(安卓原生,功能强大)

    • 是什么:使用安卓自带的UiAutomator API的语法进行定位,功能非常强大。
    • 优点:可以编写复杂的查找逻辑,如滚动查找、兄弟节点查找等。
    • 用法driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().text(“Wi-Fi”)’)

4.2 必备神器:Appium Inspector

靠猜是写不好定位符的。你需要一个“望远镜”来查看应用界面的结构。Appium Inspector(Appium 2.x 后是独立桌面应用)就是这个工具。

  • 作用:连接你的设备/模拟器,实时查看当前页面的UI控件树,获取它们的ID、Text、Class等所有属性,并可以录制操作生成代码。
  • 如何使用
    1. 启动Appium Server (appium)。
    2. 启动雷电模拟器。
    3. 打开Appium Inspector,在“Desired Capabilities”里填入和脚本中类似的配置(platformName,deviceName,appPackage,appActivity等),特别注意要加上"automationName": "UiAutomator2"
    4. 点击“Start Session”。它会自动在模拟器上安装一个辅助测试App,然后你就能看到熟悉的“设置”界面,右边是控件树。点击界面上的元素,左边会高亮对应的节点并显示其所有属性。

实操心得:在写脚本前,先用Appium Inspector把你想要操作的元素属性记录下来。优先使用resource-id,其次accessibility-id或稳定的text,最后再考虑复杂的XPath。一个稳定的定位策略是脚本长期可维护性的关键。

5. 核心操作API:让脚本“动”起来

定位到元素后,我们就可以对它进行各种操作了。Appium-Python-Client提供了丰富的API。

5.1 基础操作

  • 点击element.click()
  • 输入文本element.send_keys(“Hello Appium”)
    • 注意:输入前,最好先element.clear()一下,清空原有内容。
  • 获取文本text = element.text
  • 获取属性value = element.get_attribute(“resource-id”)“text”,“class”等。

5.2 等待机制:解决“找不到元素”的头号难题

脚本执行速度远快于界面加载速度。直接查找元素很可能因为页面没加载完而失败。必须使用等待。

  1. 强制等待(不推荐)time.sleep(5)。简单粗暴,但效率低下,无法适应网络或性能波动。
  2. 隐式等待(全局设置)
    driver.implicitly_wait(10) # 在创建driver后设置,整个driver生命周期有效
    当查找元素时,如果没立即找到,WebDriver会轮询查找,直到超时(10秒)或找到。它只对find_element方法有效。
  3. 显式等待(推荐):针对特定条件进行等待,更灵活、更高效。
    from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待“下一步”按钮出现并可点击,最多等10秒,每0.5秒检查一次 next_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((AppiumBy.ID, “com.example:id/btn_next”)) ) next_button.click()
    expected_conditions提供了很多条件,如presence_of_element_located(元素存在)、visibility_of_element_located(元素可见)等。显式等待是编写健壮脚本的最佳实践

5.3 高级操作与系统交互

  • 滑动/滚动
    from appium.webdriver.common.touch_action import TouchAction action = TouchAction(driver) action.press(x=500, y=1500).wait(200).move_to(x=500, y=500).release().perform()
    或者使用更简单的driver.swipe(start_x, start_y, end_x, end_y, duration)
  • 长按action.long_press(element).release().perform()
  • 返回键/Home键
    driver.back() # 模拟物理返回键 driver.press_keycode(3) # 3是Home键的键码
  • 启动其他Appdriver.start_activity(“com.tencent.mm”, “.ui.LauncherUI”)

6. 常见问题排查与实战技巧

即使按照教程,你也可能会遇到问题。这里是我总结的“高频故障维修手册”。

6.1 连接类问题

  • 问题:运行脚本,报错Unable to create a new remote session. Could not find a driver for platformName “Android”
    • 排查:这是Appium 2.x的典型问题。说明UiAutomator2驱动没安装或未激活。
    • 解决:运行appium driver list查看已安装驱动。确保uiautomator2存在且为true。如果没有,运行appium driver install uiautomator2
  • 问题adb devices列表为空。
    • 排查1:模拟器的“USB调试”是否开启?去“开发者选项”确认。
    • 排查2:是否有多个ADB进程冲突?运行adb kill-server然后adb start-server
    • 排查3:雷电模拟器是否提供了独立的ADB连接端口?雷电模拟器通常使用adb connect 127.0.0.1:5555来连接。可以尝试此命令。
  • 问题:Appium Server启动失败,端口被占用。
    • 解决:默认4723端口被占用。可以指定其他端口启动:appium -p 4724,同时脚本里连接地址也要改为http://localhost:4724

6.2 脚本运行类问题

  • 问题:脚本报错NoSuchElementException
    • 排查1(最常见):没有加等待。页面没加载出来就去查找元素。立即改用显式等待
    • 排查2:定位符写错了。用Appium Inspector重新核对元素的属性。注意文本内容是否包含空格、换行。
    • 排查3:元素在WebView或混合应用中。这需要切换上下文(Context),是另一个进阶话题。
  • 问题:点击没反应。
    • 排查1:点击的坐标或元素是否被其他元素遮挡?可以尝试用TouchActiontap方法,或先尝试点击元素的中心点element.click()
    • 排查2:是否需要先等待元素可点击 (element_to_be_clickable)?
  • 问题:运行一次后,第二次运行脚本报错,说session已存在。
    • 解决:在desired_caps中设置'noReset': True可以保留上次状态,但有时需要完全重启。确保脚本最后调用了driver.quit()。也可以在下次运行前,手动在Appium Server命令行窗口按Ctrl+C停止,再重启。

6.3 提升脚本稳定性的技巧

  1. 使用Page Object模式(PO):这是中大型项目的标配。将每个页面封装成一个类,页面的元素定位和操作作为类的方法。这样,当UI变化时,你只需要修改一个PO类,而不是散落在各处的脚本。
  2. 配置独立的环境变量:将JDK、SDK路径等写入系统环境变量,一劳永逸。避免在脚本或IDE中硬编码路径。
  3. 截图和日志是救命稻草:在关键步骤前后,特别是失败时,使用driver.save_screenshot(‘error.png’)截图。同时使用Python的logging模块记录详细执行日志。这样排查问题时才有据可依。
  4. 从简单开始,逐步复杂:不要一开始就想自动化整个复杂流程。先搞定“打开App-点击某个按钮-关闭App”这个闭环。成功后再逐步添加输入、滑动、断言等操作。

走到这里,你已经完成了从环境搭建到第一个脚本运行的全过程。这个简单的“点击设置”脚本,就像你学会了编程语言里的“Hello World”。它看似简单,却包含了连接设备、启动应用、定位元素、执行操作这自动化测试最核心的循环。接下来,你可以尝试用同样的方法,去自动化你手机模拟器里的计算器、通讯录,或者任何一个你想测试的App。记住,所有复杂的自动化场景,都是由这些基本的操作组合而成的。多练、多查、多踩坑,你很快就能得心应手。如果在实践中遇到新的具体问题,不妨再回过头来看看环境配置和定位策略这些基础章节,很多时候问题就出在这些最初的地方。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 7:25:05

计算机毕业设计之图书馆智能管理系统设计与实现

摘 要随着信息技术的飞速发展,传统的图书馆管理模式已无法满足现代读者日益增长的信息需求。为了提高图书馆的管理效率和服务质量,构建一个功能完善、操作便捷的图书馆智能管理系统势在必行。本系统旨在设计并实现一个基于B/S架构的图书馆智能管理系统&…

作者头像 李华
网站建设 2026/6/17 7:16:24

Wall-X核心组件解析:Qwen2.5模型、DMuon优化器与FlashAttention加速

Wall-X核心组件解析:Qwen2.5模型、DMuon优化器与FlashAttention加速 【免费下载链接】wall-x Building General-Purpose Robots Based on Embodied Foundation Model 项目地址: https://gitcode.com/gh_mirrors/wa/wall-x Wall-X是一个基于具身基础模型的通用…

作者头像 李华
网站建设 2026/6/17 7:15:41

如何用自然语言控制Blender:BlenderMCP让3D建模像聊天一样简单

如何用自然语言控制Blender:BlenderMCP让3D建模像聊天一样简单 【免费下载链接】blender-mcp 项目地址: https://gitcode.com/GitHub_Trending/bl/blender-mcp 还在为复杂的Blender建模界面而头疼吗?想象一下,只需用日常语言描述你想…

作者头像 李华
网站建设 2026/6/17 7:07:54

CoPaw+Qwen3.6-Plus:国产大模型轻量级落地实践指南

1. 项目概述:为什么把 Qwen3.6-Plus 接入 CoPaw 是当前最务实的国产大模型轻量实践路径最近两周,我几乎每天都在 CoPaw 里和 Qwen3.6-Plus 打交道——不是为了写测评稿,而是真正在用它处理日常文档摘要、会议纪要整理、技术方案初稿生成、甚至…

作者头像 李华
网站建设 2026/6/17 7:02:08

零基础入门计算神经科学:Neuromatch Academy完整学习指南

零基础入门计算神经科学:Neuromatch Academy完整学习指南 【免费下载链接】course-content NMA Computational Neuroscience course 项目地址: https://gitcode.com/gh_mirrors/cour/course-content 想揭开大脑神秘的面纱吗?想知道如何用数学和代…

作者头像 李华