1. 项目概述与价值看到这个标题很多刚接触移动端自动化测试的同学可能会觉得“5分钟搞定”有点夸张但作为一个在测试开发领域摸爬滚打了十多年的老手我可以负责任地告诉你只要环境搭对、思路清晰用PythonAppium雷电模拟器写出第一个能跑的脚本真的就是几分钟的事。这个组合之所以被无数测试工程师和开发者青睐核心在于它的“平民化”——你不需要昂贵的真机设备不需要复杂的iOS证书用一台Windows电脑和一个免费的安卓模拟器就能搭建起完整的自动化测试环境快速验证你的想法。我见过太多新手卡在环境配置和第一个脚本的“Hello World”上浪费一两天时间还跑不通最后挫败感满满。这篇教程的目的就是帮你绕开所有我踩过的坑用最直白的话把从零到一的过程掰开揉碎讲清楚。我们会聚焦于一个最经典、也最实用的场景在雷电9模拟器上自动化打开一个App比如系统自带的“设置”并点击里面的某个选项。别小看这个简单的操作它涵盖了环境搭建、设备连接、元素定位、动作执行这自动化测试的四大基石。搞定了它后续更复杂的滑动、输入、断言等操作都只是在这个基础上的延伸。2. 环境搭建一步一坑避坑指南万事开头难自动化测试的“难”十有八九出在环境上。下面这份清单是我经过无数次重装系统、配置环境后总结出来的“黄金配置”版本都经过严格验证能最大程度避免兼容性问题。请严格按照顺序操作。2.1 核心三件套Java, Android SDK, Node.js很多人一上来就装Appium这是错误的。Appium像一个指挥官它需要Java、Android SDK和Node.js这三个“兵种”各司其职。Java JDKAppium的运行基石版本选择不要追求最新。长期支持版本LTS最稳定。这里我们选择JDK 11或JDK 17。我强烈推荐JDK 11因为它在安卓自动化生态中兼容性经过了最长时间的考验。安装要点从Oracle官网或Adoptium等开源站点下载安装包。安装路径不要有中文和空格比如C:\Java\jdk-11就很好。环境变量配置关键步骤新建系统变量JAVA_HOME值为你的JDK安装路径如C:\Java\jdk-11。编辑系统变量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。访问Android开发者网站找到“Command line tools only”进行下载。解压到一个简单路径例如C:\Android\cmdline-tools。你需要手动创建latest\bin的目录结构将解压内容放入latest文件夹内。环境变量配置新建系统变量ANDROID_HOME值为你的SDK根目录例如C:\Android。在Path变量中添加%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\cmdline-tools\latest\bin。通过SDK管理器安装必要的平台工具和镜像。在命令行中可以运行sdkmanager “platform-tools” “platforms;android-29” “emulator”来安装。这里选择Android 9API 28/29是因为雷电9模拟器基于此版本兼容性好。验证命令行输入adb version。显示版本信息即成功。Node.jsAppium服务器的运行环境Appium是一个用Node.js写的服务器程序。版本选择同样选择LTS版本如Node.js 18.x。避免使用最新的奇数版本。安装从官网下载安装包一路下一步即可。安装程序会自动配置环境变量。验证命令行输入node -v和npm -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 Code或PyCharm来写代码。VS Code轻量安装Python插件即可PyCharm功能更专一强大。任选其一。2.3 测试舞台雷电模拟器9为什么是雷电9因为它稳定、免费、性能不错且基于Android 9与Appium的UIAutomator2驱动兼容性极佳。下载与安装从雷电模拟器官网下载9版本。安装路径同样避免中文和空格。关键设置务必操作启动模拟器进入系统“设置”。找到“关于平板电脑”连续点击“版本号”7次开启“开发者选项”。返回上级菜单进入“开发者选项”开启“USB调试”。这是ADB能够连接模拟器的关键。连接验证打开命令行输入adb devices。你应该能看到一个设备列表其中包含类似emulator-5554 device的行。这表明你的电脑已经识别到了雷电模拟器。如果只看到List of devices attached下面空白尝试重启模拟器或执行adb kill-server后再次adb start-server。3. 第一个脚本从零到一的完整实现环境全部绿灯现在我们来写那个“5分钟脚本”。我们的目标是让脚本自动打开雷电模拟器上的“设置”应用并点击“无线和网络”选项。3.1 获取应用关键信息appPackage与appActivityAppium需要知道你要操作哪个App以及从哪个界面启动。这需要两个标识符appPackage应用的包名相当于身份证号。appActivity应用启动时的主活动界面相当于家门号。对于系统应用“设置”我们可以用ADB命令获取确保雷电模拟器已启动并停留在桌面。命令行输入adb shell dumpsys window | findstr mCurrentFocus你会得到类似这样的输出mCurrentFocusWindow{... com.android.settings/.Settings}其中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 逐行解析与执行启动Appium Server确保你在另一个命令行窗口已经运行了appium命令并且看到4723端口监听的提示。启动雷电模拟器确保模拟器已开启并处于解锁状态。运行脚本在你的Python文件所在目录打开命令行输入python first_automation.py。观察现象如果一切顺利你会看到雷电模拟器自动打开了“设置”应用并且自动点击进入了“无线和网络”菜单。同时你的命令行会打印出成功的提示信息。脚本逻辑拆解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 主流定位策略详解ID/Resource-ID首选是什么安卓开发中给控件定义的唯一ID格式如com.example.app:id/button_login。优点唯一性强定位速度最快最稳定。用法driver.find_element(AppiumBy.ID, “com.android.settings:id/search_action_bar”)如何获取需要借助Appium Inspector或UI Automator Viewer等工具查看。Accessibility ID内容描述是什么对应安卓控件的contentDescription属性初衷是为无障碍服务设计也常被测试用来定位。优点对于有意义的图标按钮如“搜索”、“返回”开发者通常会设置且相对稳定。用法driver.find_element(AppiumBy.ACCESSIBILITY_ID, “搜索”)XPath万能但需谨慎是什么一种在XML文档中定位节点的语言。安卓的界面布局本质上是XML。优点非常灵活可以通过层级、属性、文本等多种方式组合定位当其他属性都不可用时它是最后的杀手锏。缺点性能相对较差容易因UI微调如层级变化而失效。进阶用法文本定位//*[text”确定”]组合属性//android.widget.TextView[resource-id”title” and text”欢迎”]层级定位//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.Button[3]Class Name类名是什么控件的类型如android.widget.Button,android.widget.TextView。缺点通常一个页面有大量同类控件不唯一。常与其他条件结合使用。用法driver.find_elements(AppiumBy.CLASS_NAME, “android.widget.Button”)[0].click()获取第一个按钮Android UiAutomator安卓原生功能强大是什么使用安卓自带的UiAutomator API的语法进行定位功能非常强大。优点可以编写复杂的查找逻辑如滚动查找、兄弟节点查找等。用法driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().text(“Wi-Fi”)’)4.2 必备神器Appium Inspector靠猜是写不好定位符的。你需要一个“望远镜”来查看应用界面的结构。Appium InspectorAppium 2.x 后是独立桌面应用就是这个工具。作用连接你的设备/模拟器实时查看当前页面的UI控件树获取它们的ID、Text、Class等所有属性并可以录制操作生成代码。如何使用启动Appium Server (appium)。启动雷电模拟器。打开Appium Inspector在“Desired Capabilities”里填入和脚本中类似的配置platformName,deviceName,appPackage,appActivity等特别注意要加上automationName: UiAutomator2。点击“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 等待机制解决“找不到元素”的头号难题脚本执行速度远快于界面加载速度。直接查找元素很可能因为页面没加载完而失败。必须使用等待。强制等待不推荐time.sleep(5)。简单粗暴但效率低下无法适应网络或性能波动。隐式等待全局设置driver.implicitly_wait(10) # 在创建driver后设置整个driver生命周期有效当查找元素时如果没立即找到WebDriver会轮询查找直到超时10秒或找到。它只对find_element方法有效。显式等待推荐针对特定条件进行等待更灵活、更高效。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(x500, y1500).wait(200).move_to(x500, y500).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点击的坐标或元素是否被其他元素遮挡可以尝试用TouchAction的tap方法或先尝试点击元素的中心点element.click()。排查2是否需要先等待元素可点击 (element_to_be_clickable)问题运行一次后第二次运行脚本报错说session已存在。解决在desired_caps中设置noReset: True可以保留上次状态但有时需要完全重启。确保脚本最后调用了driver.quit()。也可以在下次运行前手动在Appium Server命令行窗口按CtrlC停止再重启。6.3 提升脚本稳定性的技巧使用Page Object模式PO这是中大型项目的标配。将每个页面封装成一个类页面的元素定位和操作作为类的方法。这样当UI变化时你只需要修改一个PO类而不是散落在各处的脚本。配置独立的环境变量将JDK、SDK路径等写入系统环境变量一劳永逸。避免在脚本或IDE中硬编码路径。截图和日志是救命稻草在关键步骤前后特别是失败时使用driver.save_screenshot(‘error.png’)截图。同时使用Python的logging模块记录详细执行日志。这样排查问题时才有据可依。从简单开始逐步复杂不要一开始就想自动化整个复杂流程。先搞定“打开App-点击某个按钮-关闭App”这个闭环。成功后再逐步添加输入、滑动、断言等操作。走到这里你已经完成了从环境搭建到第一个脚本运行的全过程。这个简单的“点击设置”脚本就像你学会了编程语言里的“Hello World”。它看似简单却包含了连接设备、启动应用、定位元素、执行操作这自动化测试最核心的循环。接下来你可以尝试用同样的方法去自动化你手机模拟器里的计算器、通讯录或者任何一个你想测试的App。记住所有复杂的自动化场景都是由这些基本的操作组合而成的。多练、多查、多踩坑你很快就能得心应手。如果在实践中遇到新的具体问题不妨再回过头来看看环境配置和定位策略这些基础章节很多时候问题就出在这些最初的地方。
5分钟上手Appium自动化测试:Python+雷电模拟器环境搭建与脚本实战
发布时间:2026/6/17 7:29:35
1. 项目概述与价值看到这个标题很多刚接触移动端自动化测试的同学可能会觉得“5分钟搞定”有点夸张但作为一个在测试开发领域摸爬滚打了十多年的老手我可以负责任地告诉你只要环境搭对、思路清晰用PythonAppium雷电模拟器写出第一个能跑的脚本真的就是几分钟的事。这个组合之所以被无数测试工程师和开发者青睐核心在于它的“平民化”——你不需要昂贵的真机设备不需要复杂的iOS证书用一台Windows电脑和一个免费的安卓模拟器就能搭建起完整的自动化测试环境快速验证你的想法。我见过太多新手卡在环境配置和第一个脚本的“Hello World”上浪费一两天时间还跑不通最后挫败感满满。这篇教程的目的就是帮你绕开所有我踩过的坑用最直白的话把从零到一的过程掰开揉碎讲清楚。我们会聚焦于一个最经典、也最实用的场景在雷电9模拟器上自动化打开一个App比如系统自带的“设置”并点击里面的某个选项。别小看这个简单的操作它涵盖了环境搭建、设备连接、元素定位、动作执行这自动化测试的四大基石。搞定了它后续更复杂的滑动、输入、断言等操作都只是在这个基础上的延伸。2. 环境搭建一步一坑避坑指南万事开头难自动化测试的“难”十有八九出在环境上。下面这份清单是我经过无数次重装系统、配置环境后总结出来的“黄金配置”版本都经过严格验证能最大程度避免兼容性问题。请严格按照顺序操作。2.1 核心三件套Java, Android SDK, Node.js很多人一上来就装Appium这是错误的。Appium像一个指挥官它需要Java、Android SDK和Node.js这三个“兵种”各司其职。Java JDKAppium的运行基石版本选择不要追求最新。长期支持版本LTS最稳定。这里我们选择JDK 11或JDK 17。我强烈推荐JDK 11因为它在安卓自动化生态中兼容性经过了最长时间的考验。安装要点从Oracle官网或Adoptium等开源站点下载安装包。安装路径不要有中文和空格比如C:\Java\jdk-11就很好。环境变量配置关键步骤新建系统变量JAVA_HOME值为你的JDK安装路径如C:\Java\jdk-11。编辑系统变量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。访问Android开发者网站找到“Command line tools only”进行下载。解压到一个简单路径例如C:\Android\cmdline-tools。你需要手动创建latest\bin的目录结构将解压内容放入latest文件夹内。环境变量配置新建系统变量ANDROID_HOME值为你的SDK根目录例如C:\Android。在Path变量中添加%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\cmdline-tools\latest\bin。通过SDK管理器安装必要的平台工具和镜像。在命令行中可以运行sdkmanager “platform-tools” “platforms;android-29” “emulator”来安装。这里选择Android 9API 28/29是因为雷电9模拟器基于此版本兼容性好。验证命令行输入adb version。显示版本信息即成功。Node.jsAppium服务器的运行环境Appium是一个用Node.js写的服务器程序。版本选择同样选择LTS版本如Node.js 18.x。避免使用最新的奇数版本。安装从官网下载安装包一路下一步即可。安装程序会自动配置环境变量。验证命令行输入node -v和npm -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 Code或PyCharm来写代码。VS Code轻量安装Python插件即可PyCharm功能更专一强大。任选其一。2.3 测试舞台雷电模拟器9为什么是雷电9因为它稳定、免费、性能不错且基于Android 9与Appium的UIAutomator2驱动兼容性极佳。下载与安装从雷电模拟器官网下载9版本。安装路径同样避免中文和空格。关键设置务必操作启动模拟器进入系统“设置”。找到“关于平板电脑”连续点击“版本号”7次开启“开发者选项”。返回上级菜单进入“开发者选项”开启“USB调试”。这是ADB能够连接模拟器的关键。连接验证打开命令行输入adb devices。你应该能看到一个设备列表其中包含类似emulator-5554 device的行。这表明你的电脑已经识别到了雷电模拟器。如果只看到List of devices attached下面空白尝试重启模拟器或执行adb kill-server后再次adb start-server。3. 第一个脚本从零到一的完整实现环境全部绿灯现在我们来写那个“5分钟脚本”。我们的目标是让脚本自动打开雷电模拟器上的“设置”应用并点击“无线和网络”选项。3.1 获取应用关键信息appPackage与appActivityAppium需要知道你要操作哪个App以及从哪个界面启动。这需要两个标识符appPackage应用的包名相当于身份证号。appActivity应用启动时的主活动界面相当于家门号。对于系统应用“设置”我们可以用ADB命令获取确保雷电模拟器已启动并停留在桌面。命令行输入adb shell dumpsys window | findstr mCurrentFocus你会得到类似这样的输出mCurrentFocusWindow{... com.android.settings/.Settings}其中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 逐行解析与执行启动Appium Server确保你在另一个命令行窗口已经运行了appium命令并且看到4723端口监听的提示。启动雷电模拟器确保模拟器已开启并处于解锁状态。运行脚本在你的Python文件所在目录打开命令行输入python first_automation.py。观察现象如果一切顺利你会看到雷电模拟器自动打开了“设置”应用并且自动点击进入了“无线和网络”菜单。同时你的命令行会打印出成功的提示信息。脚本逻辑拆解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 主流定位策略详解ID/Resource-ID首选是什么安卓开发中给控件定义的唯一ID格式如com.example.app:id/button_login。优点唯一性强定位速度最快最稳定。用法driver.find_element(AppiumBy.ID, “com.android.settings:id/search_action_bar”)如何获取需要借助Appium Inspector或UI Automator Viewer等工具查看。Accessibility ID内容描述是什么对应安卓控件的contentDescription属性初衷是为无障碍服务设计也常被测试用来定位。优点对于有意义的图标按钮如“搜索”、“返回”开发者通常会设置且相对稳定。用法driver.find_element(AppiumBy.ACCESSIBILITY_ID, “搜索”)XPath万能但需谨慎是什么一种在XML文档中定位节点的语言。安卓的界面布局本质上是XML。优点非常灵活可以通过层级、属性、文本等多种方式组合定位当其他属性都不可用时它是最后的杀手锏。缺点性能相对较差容易因UI微调如层级变化而失效。进阶用法文本定位//*[text”确定”]组合属性//android.widget.TextView[resource-id”title” and text”欢迎”]层级定位//android.widget.FrameLayout/android.widget.LinearLayout/android.widget.Button[3]Class Name类名是什么控件的类型如android.widget.Button,android.widget.TextView。缺点通常一个页面有大量同类控件不唯一。常与其他条件结合使用。用法driver.find_elements(AppiumBy.CLASS_NAME, “android.widget.Button”)[0].click()获取第一个按钮Android UiAutomator安卓原生功能强大是什么使用安卓自带的UiAutomator API的语法进行定位功能非常强大。优点可以编写复杂的查找逻辑如滚动查找、兄弟节点查找等。用法driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().text(“Wi-Fi”)’)4.2 必备神器Appium Inspector靠猜是写不好定位符的。你需要一个“望远镜”来查看应用界面的结构。Appium InspectorAppium 2.x 后是独立桌面应用就是这个工具。作用连接你的设备/模拟器实时查看当前页面的UI控件树获取它们的ID、Text、Class等所有属性并可以录制操作生成代码。如何使用启动Appium Server (appium)。启动雷电模拟器。打开Appium Inspector在“Desired Capabilities”里填入和脚本中类似的配置platformName,deviceName,appPackage,appActivity等特别注意要加上automationName: UiAutomator2。点击“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 等待机制解决“找不到元素”的头号难题脚本执行速度远快于界面加载速度。直接查找元素很可能因为页面没加载完而失败。必须使用等待。强制等待不推荐time.sleep(5)。简单粗暴但效率低下无法适应网络或性能波动。隐式等待全局设置driver.implicitly_wait(10) # 在创建driver后设置整个driver生命周期有效当查找元素时如果没立即找到WebDriver会轮询查找直到超时10秒或找到。它只对find_element方法有效。显式等待推荐针对特定条件进行等待更灵活、更高效。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(x500, y1500).wait(200).move_to(x500, y500).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点击的坐标或元素是否被其他元素遮挡可以尝试用TouchAction的tap方法或先尝试点击元素的中心点element.click()。排查2是否需要先等待元素可点击 (element_to_be_clickable)问题运行一次后第二次运行脚本报错说session已存在。解决在desired_caps中设置noReset: True可以保留上次状态但有时需要完全重启。确保脚本最后调用了driver.quit()。也可以在下次运行前手动在Appium Server命令行窗口按CtrlC停止再重启。6.3 提升脚本稳定性的技巧使用Page Object模式PO这是中大型项目的标配。将每个页面封装成一个类页面的元素定位和操作作为类的方法。这样当UI变化时你只需要修改一个PO类而不是散落在各处的脚本。配置独立的环境变量将JDK、SDK路径等写入系统环境变量一劳永逸。避免在脚本或IDE中硬编码路径。截图和日志是救命稻草在关键步骤前后特别是失败时使用driver.save_screenshot(‘error.png’)截图。同时使用Python的logging模块记录详细执行日志。这样排查问题时才有据可依。从简单开始逐步复杂不要一开始就想自动化整个复杂流程。先搞定“打开App-点击某个按钮-关闭App”这个闭环。成功后再逐步添加输入、滑动、断言等操作。走到这里你已经完成了从环境搭建到第一个脚本运行的全过程。这个简单的“点击设置”脚本就像你学会了编程语言里的“Hello World”。它看似简单却包含了连接设备、启动应用、定位元素、执行操作这自动化测试最核心的循环。接下来你可以尝试用同样的方法去自动化你手机模拟器里的计算器、通讯录或者任何一个你想测试的App。记住所有复杂的自动化场景都是由这些基本的操作组合而成的。多练、多查、多踩坑你很快就能得心应手。如果在实践中遇到新的具体问题不妨再回过头来看看环境配置和定位策略这些基础章节很多时候问题就出在这些最初的地方。