Appium自动化测试入门:Python控制Android手机实战指南
1. 项目概述:为什么选择Appium来操作手机?
如果你是一名Python开发者,或者对自动化测试、数据采集、甚至是批量操作手机应用感兴趣,那么“用代码控制手机”这个想法一定在你脑海里出现过。手动在手机上点点划划,效率低下且容易出错,而Appium正是解决这个痛点的利器。它不是一个简单的点击模拟器,而是一个开源的、跨平台的移动端自动化测试框架,核心魅力在于它允许你使用自己熟悉的编程语言(比如Python)来编写脚本,驱动真实的Android或iOS设备(包括模拟器)完成一系列操作。
我最初接触Appium是为了做应用的功能回归测试。手动测试几十个用例,一遍又一遍,枯燥且容易遗漏。后来发现,它的应用场景远不止于此。比如,你可以用它来批量处理社交媒体消息、自动完成一些重复性的手机设置、甚至是为一些没有开放API的小程序或App编写自动化工具。Appium基于WebDriver协议,这意味着它的工作方式和Selenium操控浏览器非常相似,如果你有Web自动化的经验,上手会非常快。它的“一次编写,多端运行”理念(Write Once, Run Anywhere)对于需要覆盖Android和iOS双端的团队来说,能节省大量重复劳动。
简单来说,这个项目就是带你从零开始,搭建Appium+Python的环境,并编写第一个能真正操控你手机的脚本。无论你是测试工程师、爬虫工程师,还是单纯的效率工具爱好者,掌握这项技能都能为你打开一扇新的大门。接下来,我会把整个流程拆解得非常细致,包括环境配置中那些容易踩坑的细节,以及如何写出稳定、健壮的自动化脚本。
2. 环境搭建:避开那些“坑爹”的依赖冲突
环境搭建是劝退新手的第一个门槛。网上教程很多,但往往因为系统版本、软件版本更新而失效。这里我会提供一个经过验证的、清晰的步骤,并重点指出那些容易出错的环节。
2.1 核心组件安装与配置
一个完整的Appium自动化环境,需要几个核心部件协同工作:Python环境、Appium Server、设备驱动和客户端库。我们按顺序来。
第一步:确保Python环境就绪这是我们的“大脑”。建议使用Python 3.7及以上版本,太老的版本可能对某些库支持不好。安装Python时,务必勾选“Add Python to PATH”,这是为了能在命令行任何位置直接调用python和pip命令。安装完成后,打开命令行(CMD或PowerShell),输入python --version和pip --version验证是否成功。
注意:很多教程会推荐Anaconda,但对于Appium这个特定场景,我个人更推荐使用官方Python。Anaconda环境有时会与某些系统级工具(如JDK)产生微妙的路径冲突,排查起来比较麻烦。用官方Python配合虚拟环境(venv)是更干净、可控的选择。
第二步:安装Appium Python客户端库这是我们的“手”,用来向Appium Server发送指令。在命令行中执行以下命令即可:
pip install Appium-Python-Client这个库封装了WebDriver协议,让我们能用Python的语法来编写自动化指令。安装过程通常很顺利。
第三步:安装并配置Java Development Kit (JDK)Appium Server本身是用Node.js写的,但为了与Android设备通信,它底层依赖Android SDK,而Android SDK需要JDK。我们需要安装JDK 8或11(LTS版本比较稳定)。从Oracle官网或AdoptOpenJDK下载安装后,最关键的一步是配置环境变量JAVA_HOME。
- 新建系统变量
JAVA_HOME,其值为你的JDK安装路径,例如C:\Program Files\Java\jdk-11.0.xx。 - 编辑系统变量
Path,添加%JAVA_HOME%\bin。
验证:在命令行输入java -version,应能正确显示版本信息。
第四步:安装并配置Android SDK这是与Android设备对话的“语言包”。如今最方便的方式是通过Android Studio来安装。下载安装Android Studio后,在启动向导或后续的“Settings > Appearance & Behavior > System Settings > Android SDK”中,安装至少一个版本的SDK Platform(比如API 30)和对应的“Android SDK Build-Tools”。
同样需要配置环境变量:
- 新建系统变量
ANDROID_HOME,其值为你的Android SDK路径,例如C:\Users\你的用户名\AppData\Local\Android\Sdk。 - 编辑系统变量
Path,添加%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\tools(或tools\bin)。
验证:在命令行输入adb version,应能显示Android Debug Bridge的版本。adb工具是连接真机和模拟器的桥梁,至关重要。
第五步:安装Node.js与Appium ServerAppium Server是一个服务端程序,我们的Python脚本作为客户端向其发送请求。通过Node.js的包管理器npm可以轻松安装。先从Node.js官网安装Node.js(LTS版本),它会自动包含npm。
安装完Node.js后,在命令行中全局安装Appium Server:
npm install -g appium安装完成后,可以通过appium -v检查版本。此外,我强烈建议再安装一个图形化工具appium-doctor,它用来诊断你的环境是否完备:
npm install -g appium-doctor安装后运行appium-doctor,它会逐一检查JDK、Android SDK、ADB等配置,并给出明确的通过或错误提示,是排查环境问题的神器。
2.2 连接测试设备:真机与模拟器
环境搭好了,我们得有个“操作对象”。你可以选择Android真机或模拟器。
连接Android真机:
- 在手机的“设置 > 关于手机”中,连续点击“版本号”7次,开启“开发者选项”。
- 进入“开发者选项”,开启“USB调试”和“USB调试(安全设置)”(如果有)。
- 用USB线连接电脑和手机。在手机上弹出的“允许USB调试吗?”对话框中点击“确定”。
- 在电脑命令行输入
adb devices。如果看到设备列表中出现你的设备序列号,且后面跟着device(而不是unauthorized),说明连接成功。
使用Android模拟器:如果你没有安卓手机,可以使用Android Studio自带的AVD Manager创建虚拟设备。创建时,建议选择“Pixel”系列设备镜像,系统版本选择已安装SDK的版本(如API 30)。启动模拟器后,同样在命令行用adb devices确认连接。
实操心得:真机调试往往比模拟器更稳定,尤其是涉及硬件传感器(如GPS、陀螺仪)或特定厂商UI时。但模拟器在需要快速创建多个不同系统版本的测试机时非常方便。初次学习,我建议先用真机,反馈更直接。
3. 编写第一个自动化脚本:从点击开始
环境万事俱备,现在我们来写第一个脚本。我们的目标是:打开手机上的“计算器”应用,完成一次“1+2=3”的运算。这个例子虽小,但涵盖了启动会话、定位元素、执行操作的核心流程。
3.1 启动Appium Server与Desired Capabilities配置
首先,我们需要启动Appium Server。打开一个新的命令行窗口,输入:
appium看到类似[Appium] Welcome to Appium v2.x.x和[Appium] Appium REST http interface listener started on 0.0.0.0:4723的日志,说明服务已在本地4723端口启动成功。这个窗口需要保持开启,不要关闭。
接下来,创建我们的Python脚本文件,比如first_test.py。脚本的第一步是导入库并配置Desired Capabilities(简称caps)。caps是一组键值对,用于告诉Appium Server你想要如何启动这次自动化会话。
from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # 定义Desired Capabilities desired_caps = { 'platformName': 'Android', # 平台:Android 或 iOS 'platformVersion': '11', # 你的设备系统版本(可通过`adb shell getprop ro.build.version.release`查询) 'deviceName': 'your_device_name', # 设备名,可以是任意字符串,但用于日志标识 'automationName': 'UiAutomator2', # Android自动化引擎,必选(对于Android 5.0+) 'appPackage': 'com.android.calculator2', # 计算器App的包名 'appActivity': '.Calculator', # 计算器App的主活动名 'noReset': True # 会话结束后不重置App状态(如不清空数据) }关键点解析:
platformName,platformVersion,deviceName:这三个是基础信息,必须准确。deviceName在真机连接时,可以填写adb devices列出的设备序列号,或者一个易读的名字。automationName: 对于现代Android设备,必须指定为UiAutomator2,这是Google官方推荐的自动化框架。appPackage和appActivity:这是启动特定App的关键。如何获取它们?有一个简单命令:adb shell dumpsys window | findstr mCurrentFocus(Windows)或grep(Mac/Linux)。先手动打开目标App,然后在命令行运行此命令,输出中/后面的部分就是appPackage和appActivity。noReset: 设为True可以避免每次脚本运行后App数据被清空,方便调试。
3.2 元素定位与交互操作
配置好caps后,我们就可以初始化驱动并开始操作了。
# 连接Appium Server,初始化驱动 driver = webdriver.Remote('http://localhost:4723', desired_caps) # 等待元素加载的隐式等待时间,单位秒 driver.implicitly_wait(10) try: # 1. 定位并点击数字“1” # 通过资源ID定位是最稳定、首选的方式 digit_1 = driver.find_element(AppiumBy.ID, 'com.android.calculator2:id/digit_1') digit_1.click() time.sleep(0.5) # 短暂等待,模拟人工操作间隔 # 2. 定位并点击加号“+” plus_op = driver.find_element(AppiumBy.ID, 'com.android.calculator2:id/op_add') plus_op.click() time.sleep(0.5) # 3. 定位并点击数字“2” digit_2 = driver.find_element(AppiumBy.ID, 'com.android.calculator2:id/digit_2') digit_2.click() time.sleep(0.5) # 4. 定位并点击等号“=” equals_btn = driver.find_element(AppiumBy.ID, 'com.android.calculator2:id/eq') equals_btn.click() time.sleep(1) # 等待计算结果刷新 # 5. 定位结果框,获取计算结果文本 result_field = driver.find_element(AppiumBy.ID, 'com.android.calculator2:id/result') actual_result = result_field.text print(f"计算结果为:{actual_result}") # 断言验证 expected_result = '3' if actual_result == expected_result: print("测试通过!") else: print(f"测试失败!期望结果:{expected_result},实际结果:{actual_result}") except Exception as e: print(f"脚本执行过程中出现错误:{e}") finally: # 无论成功与否,最后都要关闭会话 driver.quit() print("自动化会话已结束。")代码逻辑详解:
webdriver.Remote:建立与Appium Server的连接,传入caps配置。Server会根据配置启动或连接到指定设备上的计算器App。implicitly_wait(10):设置隐式等待10秒。这意味着在查找元素时,如果元素没有立即出现,驱动会最多等待10秒,期间不断尝试查找。这比硬编码time.sleep更智能,能提高脚本稳定性。- 元素定位:我们全部使用了
AppiumBy.ID,即通过元素的resource-id属性定位。这是Android上最可靠、性能最好的定位方式。如何获取这些ID?这就需要用到Appium Inspector工具(后面会介绍)。 - 操作链:
click()方法模拟点击。我们按照“1”、“+”、“2”、“=”的顺序依次点击。 - 结果验证:最后我们找到显示结果的元素,获取其文本(
text属性),并与预期结果“3”进行比较,完成一个简单的自动化测试验证。 driver.quit():放在finally块中,确保无论脚本是否出错,最终都会关闭驱动,释放Appium Server和设备上的会话资源,这是一个好习惯。
运行这个脚本(python first_test.py),你应该能看到手机上的计算器被自动打开,并完成了一次加法运算,同时在命令行打印出结果。恭喜你,你已经成功用Python控制了手机!
4. 核心技能进阶:定位、等待与高级操作
第一个脚本跑通只是开始。在实际项目中,你会遇到各种复杂的界面和交互。掌握以下核心技能,才能写出健壮、可维护的自动化脚本。
4.1 元素定位策略大全与选择优先级
定位不到元素是自动化脚本失败的首要原因。Appium提供了多种定位策略,你需要根据实际情况选择最合适的一种。优先级从高到低建议如下:
- ID (resource-id):
driver.find_element(AppiumBy.ID, “元素id”)。这是首选和最佳策略。Android的resource-id和iOS的name/accessibility id通常具有唯一性,定位速度快且稳定。计算器例子中用的就是这种。 - Accessibility ID (content-desc):
driver.find_element(AppiumBy.ACCESSIBILITY_ID, “描述文本”)。对于没有ID但设置了无障碍访问标签(contentDescriptionin Android,accessibilityLabelin iOS)的元素,这是次优选择。它语义化较好。 - XPath:
driver.find_element(AppiumBy.XPATH, “xpath表达式”)。功能强大且灵活,可以定位几乎任何元素,尤其是没有ID和Accessibility ID时。但这是性能最差、最不稳定的方式,因为UI结构微调就可能导致XPath失效。应尽量避免使用绝对路径(以/开头),多使用相对路径和属性组合。- 示例:
//android.widget.Button[@text=‘确定’]
- 示例:
- Class Name:
driver.find_element(AppiumBy.CLASS_NAME, “android.widget.Button”)。通过控件类型定位。通常一个界面上同类控件太多,很少能唯一确定一个元素,多用于查找元素列表。 - Android UiAutomator (仅Android):
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().text(“确定”)’)。使用Android原生UiAutomator API的语法,功能强大,支持多种选择器组合,性能优于复杂XPath。 - iOS Predicate String (仅iOS):
driver.find_element(AppiumBy.IOS_PREDICATE, “label == ‘确定’”)。在iOS上,这是比XPath更推荐使用的强大定位方式。
实操心得:在项目初期,应推动开发同学为关键UI元素添加稳定的
resource-id或accessibility id。这属于“测试左移”,能极大提升后续自动化脚本的稳定性和开发效率。如果只能使用XPath,尽量让其简短,并依赖于相对稳定的属性(如text),避免使用索引(如[1])。
4.2 智能等待:告别脆弱的time.sleep
在第一个脚本中,我用了time.sleep,这只是为了演示。在实际脚本中,滥用time.sleep是万恶之源——它会让脚本运行缓慢,且无法适应网络或设备性能波动。正确的做法是使用显式等待。
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 设置显式等待对象,超时时间10秒,轮询间隔0.5秒 wait = WebDriverWait(driver, 10, poll_frequency=0.5) # 等待“确定”按钮出现并可点击,然后才点击它 ok_button = wait.until(EC.element_to_be_clickable((AppiumBy.ID, ‘com.example:id/ok_btn’))) ok_button.click() # 等待某个Toast提示信息出现并获取其文本 toast_locator = (AppiumBy.XPATH, ‘//android.widget.Toast’) toast_element = wait.until(EC.presence_of_element_located(toast_locator)) print(f“Toast内容:{toast_element.text}”)显式等待的原理是:在设定的超时时间内,按照指定的频率去检查条件是否满足。一旦满足,就立即返回元素;如果超时仍未满足,则抛出TimeoutException。它比隐式等待更精确,能针对特定操作设置等待条件,如element_to_be_clickable(元素可点击)、visibility_of_element_located(元素可见)等。这能有效解决因页面加载慢、动画未完成导致的元素找不到的问题。
4.3 常用操作API与手势控制
除了click(),Appium提供了丰富的操作API来模拟真实用户行为。
基本操作:
send_keys(‘text’):向输入框输入文本。输入前最好先clear()一下。get_attribute(‘attributeName’):获取元素属性,如text,enabled,selected等,常用于断言。is_displayed(),is_enabled(),is_selected():判断元素状态。
复杂手势(TouchAction / W3C Actions):对于滑动、长按、拖拽、多点触控等操作,需要使用手势API。旧版的TouchAction已逐渐被W3C Actions取代,建议学习新的方式。
from appium.webdriver.common.appiumby import AppiumBy from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.actions import interaction from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.pointer_input import PointerInput # 示例:从屏幕中央向下滑动(模拟下拉刷新) actions = ActionChains(driver) actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, “touch”)) actions.w3c_actions.pointer_action.move_to_location(500, 1000) # 起点坐标 actions.w3c_actions.pointer_action.pointer_down() actions.w3c_actions.pointer_action.move_to_location(500, 500) # 终点坐标 actions.w3c_actions.pointer_action.pointer_up() actions.perform()坐标获取可以通过driver.get_window_size()得到屏幕尺寸后计算。对于更复杂的滑动(如九宫格解锁),可能需要封装一个专门的函数。
系统按键与上下文操作:
driver.press_keycode(24):模拟按下物理键(24是音量+)。driver.back():模拟按下返回键。driver.start_activity(app_package, app_activity):直接启动另一个App的特定页面。driver.get_clipboard_text(),driver.set_clipboard_text(‘text’):操作剪贴板。
5. 必备工具与调试技巧
工欲善其事,必先利其器。掌握以下工具和技巧,能让你的Appium自动化开发事半功倍。
5.1 Appium Inspector:你的“眼睛”
Appium Inspector是一个独立的桌面应用,用于检查移动应用的元素层级和属性。它是编写和调试脚本不可或缺的工具。
- 启动与连接:启动Appium Inspector,在“Remote Host”填
localhost,端口4723。在“Desired Capabilities”区域,填入和你的Python脚本中一样的caps配置(注意格式是JSON)。点击“Start Session”。 - 界面解析:连接成功后,Inspector会在你的设备上启动目标App,并在右侧显示当前页面的UI层级树。你可以点击树中的节点,左侧会同步高亮设备上的对应元素,并显示该元素的所有属性(如
resource-id,text,class,bounds等)。 - 录制与复制:Inspector可以录制你的操作并生成多种语言的代码片段(包括Python)。更常用的是,你可以直接右键点击UI树中的元素,复制其
resource-id或生成XPath,然后粘贴到你的脚本中。
注意事项:Appium Inspector 2.x版本需要与Appium Server 2.x配合使用,且首次启动可能需要下载一些组件,请保持网络通畅。确保Inspector中配置的
caps(特别是appPackage和appActivity)与你的脚本一致,否则看到的界面可能不对。
5.2 日志分析与问题排查
当脚本运行失败时,查看日志是定位问题的关键。日志主要来自两个地方:
- Appium Server日志:就是你启动
appium命令的那个控制台窗口。里面包含了服务端与客户端(你的脚本)、服务端与设备(通过ADB)的所有通信细节。错误信息通常非常详细,比如“元素找不到”、“会话无法创建”等。遇到问题时,首先仔细阅读这里的红色错误堆栈信息。 - Python脚本日志:你可以在脚本中引入
logging模块,打印更多调试信息。此外,driver.get_screenshot_as_file(‘error.png’)是一个救命函数,在catch异常块中截取当前屏幕,能直观地看到失败时App停在了哪个界面。 - ADB日志:对于更深层的、与设备相关的问题,可以查看ADB日志。在命令行使用
adb logcat可以实时输出设备日志,配合grep过滤关键词(如App包名、崩溃信息)。对于崩溃问题,adb logcat *:E可以只显示错误级别的日志。
常见错误速查:
SessionNotCreatedException:无法创建会话。检查caps配置是否正确(平台版本、设备名、app路径),Appium Server是否正常启动,设备是否已通过adb devices识别。NoSuchElementException:找不到元素。这是最常见错误。检查:1) 定位器是否正确(用Inspector复核);2) 页面是否已加载完成(增加显式等待);3) 是否进入了正确的Activity(页面跳转后元素属于新页面);4) 元素是否在WebView内(需要切换上下文)。InvalidSelectorException:选择器语法错误。检查XPath或UiAutomator表达式语法。- 元素可以找到但
click()不生效:可能元素被遮挡、不可点击、或者需要的是其他操作(如tap)。尝试使用driver.execute_script(‘mobile: click’, {‘element’: element.id})这种原生方法,或者先尝试tap屏幕坐标。
5.3 组织与封装:让脚本更专业
当自动化用例越来越多时,良好的代码组织至关重要。
- Page Object Model (POM):这是UI自动化测试的标准设计模式。其核心思想是将每个页面封装成一个类,页面上的元素作为这个类的属性,页面上的操作(如输入、点击)作为这个类的方法。测试脚本则调用这些页面对象的方法来完成业务流程。
- 优点:极大提高了代码的可读性和可维护性。当UI发生变化时,通常只需要修改对应的页面对象类,而不需要修改大量测试脚本。实现了业务逻辑和UI细节的分离。
# 示例:登录页面对象 class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = (AppiumBy.ID, ‘com.app:id/username’) self.password_input = (AppiumBy.ID, ‘com.app:id/password’) self.login_button = (AppiumBy.ID, ‘com.app:id/login_btn’) def login(self, username, password): wait = WebDriverWait(self.driver, 10) wait.until(EC.visibility_of_element_located(self.username_input)).send_keys(username) self.driver.find_element(*self.password_input).send_keys(password) self.driver.find_element(*self.login_button).click() # 在测试脚本中使用 def test_login(): driver = webdriver.Remote(‘http://localhost:4723’, caps) login_page = LoginPage(driver) login_page.login(‘testuser’, ‘password123’) # ... 后续断言- 配置文件管理:将
caps配置、设备信息、App信息、服务器地址等抽取到配置文件(如config.yaml或config.ini)中。这样切换测试环境(如从测试服到生产服)或设备时,只需修改配置文件,无需改动代码。 - 测试框架集成:将你的脚本与单元测试框架(如
pytest或unittest)结合。这可以让你利用框架的测试发现、夹具(fixture,用于管理driver的生命周期)、断言和报告生成功能。pytest尤其强大,插件生态丰富。 - 持续集成:将自动化脚本接入Jenkins、GitLab CI等持续集成工具,实现定时运行或代码提交后触发运行,并自动生成测试报告,将结果通知团队。
6. 实战扩展:应对复杂场景
掌握了基础,我们来看看如何应对一些更复杂的真实场景。
6.1 处理混合应用与WebView
很多App内嵌了H5页面(WebView)。自动化这类元素需要切换上下文(Context)。
- 获取所有上下文:
driver.contexts会返回一个列表,如[‘NATIVE_APP’, ‘WEBVIEW_com.example.app’]。 - 切换到WebView上下文:
driver.switch_to.context(‘WEBVIEW_com.example.app’)。切换后,你就可以像使用Selenium一样,使用CSS选择器、Link Text等方式定位H5页面中的元素了。 - 切换回原生上下文:操作完H5后,记得切换回来:
driver.switch_to.context(‘NATIVE_APP’)。
注意:要自动化WebView,必须在
caps中启用ChromeDriver自动化。对于Android,通常需要设置caps[‘chromedriverExecutable’]指向一个合适的ChromeDriver版本,并且App的WebView必须设置为“可调试”模式。
6.2 处理弹窗、权限与通知
系统弹窗(如权限申请、GPS提示)和App内的弹窗是自动化的常见障碍。
- 系统弹窗:可以尝试使用
driver.switch_to.alert来处理,但并非所有系统弹窗都适用。更通用的方法是使用ADB命令模拟按键来接受或拒绝。例如,在脚本中调用os.system(‘adb shell input keyevent KEYCODE_ENTER’)来模拟按下回车键(可能对应“确定”)。 - App内弹窗:将其视为普通UI元素进行定位和操作。关键在于确保你的定位器能唯一识别弹窗上的按钮。有时弹窗出现需要时间,务必使用显式等待。
- 通知栏:下拉通知栏需要用到手势API(滑动从屏幕顶部下滑)。处理完通知后,通常需要再次上滑或点击返回键关闭通知栏。
6.3 数据驱动与参数化测试
为了提高脚本的复用性和测试覆盖率,我们需要将测试数据与脚本逻辑分离。
import pytest import json # 从JSON文件加载测试数据 with open(‘test_data.json’, ‘r’) as f: test_cases = json.load(f) @pytest.mark.parametrize(‘username, password, expected’, test_cases) def test_login_with_data(driver, username, password, expected): login_page = LoginPage(driver) login_page.login(username, password) # 根据expected中的预期结果进行断言 if expected == ‘success’: assert HomePage(driver).is_displayed() else: assert login_page.get_error_msg() == expected[‘error’]使用pytest的@pytest.mark.parametrize装饰器,可以轻松实现参数化。测试数据可以存放在JSON、YAML或Excel文件中。这样,添加新的测试用例只需要修改数据文件,无需改动脚本。
6.4 性能与稳定性优化
当自动化规模变大时,脚本的稳定性和执行速度成为关键。
- 减少不必要的等待:用显式等待替代固定的
sleep。对于确实需要固定等待的地方(如等待一个动画强制播放完),将其时间设置到能接受的最小值。 - 使用更稳定的定位器:坚持使用
resource-id,避免使用可能变化的XPath索引。 - 截图与日志:在关键步骤和失败时自动截图、记录日志。这不仅是排查问题的依据,也是生成测试报告的重要素材。
- 会话复用:对于一组相关的测试用例,可以考虑不每次结束后都
driver.quit(),而是在一个会话内顺序执行,用driver.reset()或driver.start_activity来重置App状态,这比重新启动App要快得多。但要注意状态隔离,避免用例间相互影响。 - 并行测试:利用Appium的Grid模式或Selenium Grid,可以同时在多台设备上运行测试,大幅缩短整体执行时间。这需要更复杂的基础设施搭建。
从环境搭建到第一个脚本,再到深入核心技能、工具使用和应对复杂场景,这条路我走过,也踩过不少坑。自动化脚本不是一蹴而就的,需要不断地调试、优化和重构。最深刻的体会是,稳定性比炫技更重要。一个能稳定运行、准确定位、清晰报错的脚本,远比一个用了各种高级技巧但动不动就失败的脚本有价值。开始的时候,可以从模仿和复制Inspector生成的代码入手,然后慢慢理解每一行代码背后的含义,逐步尝试封装和设计模式。当你第一次用脚本完成一个复杂的业务流程,或者通过自动化发现了一个人工难以发现的边界Bug时,那种成就感会告诉你,这一切都是值得的。