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

零基础Appium自动化测试入门:环境搭建、脚本编写与框架设计实战

1. 项目概述:为什么是Appium?

如果你正在看这篇文章,大概率是刚接触移动端自动化测试,或者被“零基础入门到精通”这个标题吸引过来的。我干了快十年的软件测试,从功能点点点到性能压测,再到后来专攻自动化,可以说市面上主流的自动化工具和框架都摸过一遍。今天,咱们不聊那些虚的,就聚焦一个点:Appium。为什么在众多移动端自动化工具里,我建议新手从Appium开始?因为它几乎是目前唯一一个能同时搞定iOS和Android两大平台,并且支持用你熟悉的编程语言(比如Python、Java)来写脚本的开源工具。这意味着你学一套东西,就能覆盖两个生态,性价比极高。

这几年,随着App迭代速度越来越快,回归测试的压力巨大,纯靠手工点点点已经跟不上节奏了。自动化测试从“加分项”变成了“必备技能”。而Appium,凭借其基于WebDriver协议(和Selenium一样)的设计,对测试开发人员非常友好。你之前如果是做Web自动化的,用Selenium,那上手Appium会非常快,很多概念是相通的。这篇文章,我会把我从零开始踩过的坑、总结的最佳实践,以及如何构建一个健壮自动化框架的核心思路,毫无保留地分享给你。目标很简单:让你看完就能动手,从环境搭建到写出第一个能稳定运行的脚本,再到能处理复杂场景和搭建测试框架,一步步带你走通。

2. 核心需求解析:我们到底要自动化什么?

在撸起袖子装环境之前,我们必须先想清楚:自动化测试到底要解决什么问题?盲目开始,很容易陷入“为了自动化而自动化”的陷阱,投入大量时间,产出却很少。

2.1 移动端自动化的典型场景

移动端测试和Web测试有很大不同,它受设备、操作系统版本、屏幕尺寸、网络环境等因素影响更大。Appium自动化主要覆盖以下几类核心场景:

  1. 冒烟测试/构建验证测试(BVT):每次发版前,用自动化脚本快速跑一遍核心业务流程,确保主功能没挂。这是自动化 ROI(投资回报率)最高的地方。
  2. 回归测试:这是自动化的主战场。新功能开发完成后,用已有的自动化用例集进行回归,解放测试人员的重复劳动。
  3. 兼容性测试:虽然Appium本身不直接提供云测设备,但你可以将脚本集成到云测平台(如BrowserStack, Sauce Labs)的SDK中,实现在大量不同型号、版本的真机或模拟器上自动运行。
  4. 稳定性测试(Monkey Test):编写或利用工具模拟用户随机操作,长时间运行App,检测是否会崩溃、内存泄漏等。
  5. 数据驱动测试:用同一套脚本逻辑,遍历不同的测试数据(如登录名/密码、搜索关键词、商品ID等)。

2.2 零基础学习者的核心诉求

对于新手,痛点非常明确:

  • 环境复杂:需要配置Java、Android SDK、Node.js、Appium Server以及各种依赖,一步错步步错。
  • 元素定位难:移动端元素不像Web端有稳定的ID或CSS选择器,动态ID、嵌套层级、混合应用(Hybrid App)都是挑战。
  • 脚本不稳定:跑着跑着就失败了,可能是元素没加载出来,可能是弹窗干扰,也可能是设备突然卡了。
  • 不知如何组织代码:脚本写得很乱,复用性差,维护成本高。

别担心,下面我会针对每一个痛点,给出具体的解决方案和实操步骤。

3. 环境搭建:避开初学者90%的坑

环境搭建是劝退新手的第一个拦路虎。网上教程很多,但往往跟不上软件版本的更新。我这里提供一个“最小化、可验证”的搭建思路,优先保证你能跑起来,再考虑优化。

3.1 基础环境准备(Windows/macOS通用思路)

我们以测试Android应用为例,这是最常见的学习路径。

  1. 安装Java JDK

    • 为什么需要:Appium Server(尤其是老版本)和Android构建工具依赖Java环境。
    • 版本选择:建议安装JDK 8或JDK 11(LTS长期支持版)。太高版本可能遇到兼容性问题。
    • 验证:安装后,在终端或CMD输入java -versionjavac -version,能显示版本号即成功。
    • 注意:务必配置好JAVA_HOME环境变量,并把%JAVA_HOME%\bin添加到PATH中。
  2. 安装Node.js 和 npm

    • 为什么需要:Appium Server 本身是一个Node.js应用,我们需要通过npm(Node包管理器)来安装它。
    • 版本选择:去Node.js官网下载最新的LTS版本即可。
    • 验证:安装后,在终端输入node -vnpm -v,显示版本号即成功。

3.2 Android环境配置(核心难点)

这是最麻烦的一步,请耐心跟随。

  1. 下载Android Studio

    • 不要怕,我们不一定用它写代码,但需要它来管理Android SDK和创建模拟器。
    • 官网下载安装包,安装过程中,在“选择组件”页面,务必勾选:
      • Android SDK
      • Android SDK Platform
      • Android Virtual Device
    • 其他如Intel HAXM(硬件加速)也建议勾选,能大幅提升模拟器性能。
  2. 配置Android SDK环境变量

    • 安装完成后,打开Android Studio,在欢迎界面点击“More Actions” -> “SDK Manager”。
    • “SDK Platforms”选项卡中,至少选择一个Android版本(如最新的Android 14 或 常用的Android 11)进行安装。记住上方显示的“Android SDK Location”路径(例如C:\Users\YourName\AppData\Local\Android\Sdk)。
    • 配置系统环境变量:
      • ANDROID_HOME:值设为上面的SDK路径。
      • PATH变量中,添加以下三条(具体路径根据你的ANDROID_HOME调整):
        • %ANDROID_HOME%\tools
        • %ANDROID_HOME%\platform-tools
        • %ANDROID_HOME%\emulator
    • 验证:关闭所有终端重新打开,输入adb version。如果显示Android Debug Bridge版本信息,说明SDK配置成功。adb是我们与真机或模拟器通信的最关键工具。
  3. 创建安卓虚拟设备(AVD)

    • 在Android Studio欢迎页,点击“More Actions” -> “AVD Manager”。
    • 点击“Create Virtual Device”,选择一个设备型号(如Pixel 4),然后选择你刚才下载的系统镜像(如Android 11.0)。
    • 启动这个AVD,确保模拟器能正常开机进入桌面。

实操心得:很多人在环境变量上栽跟头。一个快速验证所有环境变量是否生效的方法是:新开一个CMD或终端,依次执行java -version,adb version,emulator -list-avds。如果都能正确输出,说明基础环境基本OK。

3.3 安装Appium

现在我们来安装主角。Appium有两个主要版本:1.x 和 2.x。对于新手,我强烈建议从Appium 2.x开始,它是未来,架构更清晰。

  1. 通过npm安装Appium Server

    • 打开终端(管理员权限可能更好),执行:
      npm install -g appium
    • 这会在全局安装最新的Appium(目前是2.x)。安装完成后,执行appium -v查看版本。
  2. 安装Appium Driver

    • Appium 2.x 采用了插件化架构,你需要为你测试的平台安装对应的“驱动”(Driver)。
    • 对于Android,安装uiautomator2驱动(这是目前最稳定、功能最全的Android驱动):
      appium driver install uiautomator2
    • 对于iOS,需要安装xcuitest驱动(但前提是你有macOS系统和Xcode环境):
      appium driver install xcuitest
  3. 安装Appium Inspector(可视化元素定位工具)

    • 这是新手神器!以前叫Appium Desktop,现在独立出来了。它就像一个移动端的“浏览器开发者工具”,可以连接设备,查看页面元素结构,并生成定位代码。
    • 去Appium Inspector的GitHub仓库下载对应你操作系统的桌面客户端安装包,直接安装即可。
    • 注意:Appium Inspector需要和Appium Server配合使用。你启动Appium Server后,在Inspector里配置好Server地址和设备能力(Capabilities),才能连接。

3.4 一个快速验证环境的方法

  1. 启动Android模拟器(或连接一台开启了USB调试的真机)。
  2. 在终端启动Appium Server:appium。看到[Appium] Welcome to Appium v2.x.x[Appium] Appium REST http interface listener started on 0.0.0.0:4723之类的日志,说明Server启动成功。
  3. 打开Appium Inspector,配置如下:
    • Remote Host:127.0.0.1
    • Remote Port:4723
    • Remote Path:/
    • Capabilities 里添加(这是一个最简化的Android配置):
      { "platformName": "Android", "appium:automationName": "UiAutomator2", "appium:deviceName": "你的模拟器名称(通过 `adb devices` 获取)", "appium:platformVersion": "你的安卓版本号" }
  4. 点击“Start Session”。如果一切顺利,Inspector会连接到你的模拟器,并显示当前屏幕的画面和元素树。

走到这一步,恭喜你,最艰难的环境关已经过了!如果中间任何一步报错,请仔细核对上述步骤,并善用错误信息去搜索引擎查找解决方案,大部分问题都有前人踩过坑。

4. 核心概念与第一个脚本

环境搞定,我们来理解几个核心概念,然后写第一个“Hello World”脚本。

4.1 理解Desired Capabilities

这是Appium脚本的“钥匙”,它告诉Appium Server:你想如何启动一个会话(Session)。本质上是一个JSON对象,定义了测试设备、应用、行为等所有初始设置。

对于Android,最关键的几个能力是:

  • platformName: 操作系统,“Android”“iOS”
  • appium:automationName: 自动化引擎,Android上常用“UiAutomator2”,iOS上常用“XCUITest”
  • appium:deviceName: 设备名称,可以是模拟器名,也可以是adb devices列出的设备ID。
  • appium:platformVersion: 安卓系统版本号。
  • appium:appPackageappium:appActivity: 要测试的App的包名和启动Activity名。这相当于App的“入口地址”。
  • appium:app: 如果要安装测试,这里填APK文件的绝对路径。

如何获取包名和Activity?最简单的方法:在设备上打开你要测的App,然后在终端执行adb shell dumpsys window | findstr mCurrentFocus(Windows) 或adb shell dumpsys window | grep mCurrentFocus(macOS/Linux)。输出结果中/前面的就是包名,后面的是Activity名。

4.2 元素定位策略

这是自动化测试的基石。Appium支持多种定位方式,优先级建议如下:

  1. resource-id(Android) /accessibility-id(iOS): 相当于Web中的ID,是首选。如果开发同学规范地给元素加了这些ID,你的脚本会非常稳定。
  2. xpath: 功能强大但容易“脆”。尽量使用相对路径和属性组合,避免使用绝对路径和索引。例如://android.widget.TextView[@text="登录"]
  3. class name: 通常用于找同一类元素的集合,比如所有按钮android.widget.Button
  4. android uiautomator(Android) /ios predicate string(iOS): 平台原生的定位器,功能强大,语法稍复杂。例如Android:new UiSelector().text("确定")

黄金法则:优先使用唯一的、语义化的ID。没有ID时,组合其他属性用xpath。尽量减少对文本(text)的依赖,因为文本容易变化且涉及多语言。

4.3 编写第一个Python脚本

我们以Python为例,因为它语法简洁,是自动化测试的热门语言。首先确保安装了Appium的Python客户端库:pip install Appium-Python-Client

假设我们要自动化测试手机上的“计算器”App(几乎所有安卓手机都有)。

from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # 1. 定义Desired Capabilities desired_caps = { 'platformName': 'Android', 'automationName': 'UiAutomator2', 'deviceName': 'Pixel_4_API_30', # 改成你的模拟器名称 'platformVersion': '11.0', # 改成你的系统版本 'appPackage': 'com.google.android.calculator', # 计算器包名,可能因厂商而异 'appActivity': 'com.android.calculator2.Calculator', # 计算器Activity 'noReset': True # 不重置应用状态,避免每次清空数据 } # 2. 连接Appium Server driver = webdriver.Remote('http://localhost:4723', desired_caps) # 3. 等待应用加载 time.sleep(2) # 4. 执行操作:计算 8 + 5 # 点击数字 8 eight_btn = driver.find_element(AppiumBy.ID, 'com.google.android.calculator:id/digit_8') eight_btn.click() # 点击加号 + plus_btn = driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'plus') # 计算器里加号用了accessibility id plus_btn.click() # 点击数字 5 five_btn = driver.find_element(AppiumBy.ID, 'com.google.android.calculator:id/digit_5') five_btn.click() # 点击等号 = equals_btn = driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'equals') equals_btn.click() # 5. 获取结果 result = driver.find_element(AppiumBy.ID, 'com.google.android.calculator:id/result_final') print(f"计算结果为:{result.text}") # 6. 等待几秒查看结果 time.sleep(3) # 7. 关闭会话 driver.quit()

脚本解析

  • 我们通过webdriver.Remote连接本地启动的Appium Server。
  • find_element方法用于定位元素,这里演示了通过IDACCESSIBILITY_ID定位。
  • 操作流程就是模拟用户点击:8 -> + -> 5 -> =。
  • 最后通过元素的text属性获取结果并打印。

运行这个脚本前,请确保:

  1. Appium Server 正在运行 (appium命令)。
  2. 模拟器或真机已就绪。
  3. 将脚本中的deviceNameplatformVersionappPackageappActivity替换成你实际环境的值。

如果运行成功,你会看到模拟器里的计算器自动完成了一次加法,并在控制台打印出结果。这一刻的成就感,是驱动你继续学习的最佳燃料。

5. 从脚本到框架:构建可维护的测试体系

能跑通单个脚本只是起点。真正的价值在于构建一个易于维护、可扩展、稳定的自动化测试框架。否则,脚本会很快变成“屎山”,无人敢动。

5.1 测试框架设计思路(以Python+Pytest为例)

一个结构清晰的框架通常包含以下目录:

your_automation_project/ ├── config/ # 配置文件 │ ├── __init__.py │ └── config.yaml # 存放设备能力、服务器地址、账号密码等 ├── page_objects/ # 页面对象模型(核心) │ ├── __init__.py │ ├── base_page.py # 所有Page类的基类 │ ├── login_page.py # 登录页面 │ └── home_page.py # 主页 ├── test_cases/ # 测试用例 │ ├── __init__.py │ ├── conftest.py # Pytest的fixture配置,如初始化driver │ └── test_login.py # 登录测试用例 ├── utils/ # 工具类 │ ├── __init__.py │ ├── driver_manager.py # 驱动管理,单例模式管理driver │ └── logger.py # 日志记录 ├── reports/ # 测试报告(自动生成) ├── requirements.txt # Python依赖包列表 └── run_tests.py # 测试运行入口

5.2 实现页面对象模型(Page Object Model, POM)

这是自动化测试中最重要的设计模式,没有之一。它的核心思想是将页面元素定位页面操作行为封装成一个类(Page类)。测试用例只关心业务逻辑,不关心元素如何定位。

base_page.py示例

from appium.webdriver.webdriver import WebDriver from appium.webdriver.common.appiumby import AppiumBy import logging class BasePage: def __init__(self, driver: WebDriver): self.driver = driver self.logger = logging.getLogger(__name__) def find(self, locator): """查找元素,加入显式等待和日志""" self.logger.info(f"正在查找元素: {locator}") # 这里可以封装显式等待,后面会讲 return self.driver.find_element(*locator) def click(self, locator): self.find(locator).click() self.logger.info(f"点击元素: {locator}") def input_text(self, locator, text): element = self.find(locator) element.clear() element.send_keys(text) self.logger.info(f"在元素 {locator} 中输入文本: {text}")

login_page.py示例

from appium.webdriver.common.appiumby import AppiumBy from page_objects.base_page import BasePage class LoginPage(BasePage): # 将元素定位符定义为类的属性,便于统一管理 USERNAME_INPUT = (AppiumBy.ID, "com.example.app:id/username") PASSWORD_INPUT = (AppiumBy.ID, "com.example.app:id/password") LOGIN_BUTTON = (AppiumBy.ID, "com.example.app:id/login_btn") ERROR_MSG = (AppiumBy.ID, "com.example.app:id/error_tv") def login(self, username, password): """登录操作""" self.input_text(self.USERNAME_INPUT, username) self.input_text(self.PASSWORD_INPUT, password) self.click(self.LOGIN_BUTTON) def get_error_message(self): """获取错误提示信息""" return self.find(self.ERROR_MSG).text

test_login.py示例

import pytest from page_objects.login_page import LoginPage class TestLogin: def test_login_success(self, init_driver): # init_driver 是conftest.py中定义的fixture """测试登录成功""" driver = init_driver login_page = LoginPage(driver) login_page.login("correct_user", "correct_password") # 断言:登录后应跳转到首页,这里可以验证首页的某个元素 # assert HomePage(driver).is_displayed() def test_login_failed_with_wrong_password(self, init_driver): """测试密码错误""" driver = init_driver login_page = LoginPage(driver) login_page.login("correct_user", "wrong_password") error_msg = login_page.get_error_message() assert "密码错误" in error_msg

看,测试用例变得多么清晰!如果登录页面的输入框ID变了,你只需要去修改LoginPage类中的USERNAME_INPUT这一个地方,所有用到这个输入框的测试用例都不需要改。这就是POM模式维护性高的原因。

5.3 使用Pytest Fixture管理Driver生命周期

conftest.py是Pytest的本地插件文件,我们可以在这里定义driver的初始化和清理,确保每个测试用例都有干净的环境。

import pytest from appium import webdriver from utils.driver_manager import DriverManager # 假设我们有一个管理driver的工具类 import yaml def load_config(): with open('./config/config.yaml', 'r', encoding='utf-8') as f: return yaml.safe_load(f) @pytest.fixture(scope="function") # 每个测试函数执行一次 def init_driver(): config = load_config() caps = config['desired_capabilities']['android'] server_url = config['appium_server']['url'] driver = webdriver.Remote(server_url, caps) driver.implicitly_wait(10) # 设置全局隐式等待 yield driver # 将driver对象传递给测试用例 # 测试用例执行完毕后,执行清理 if driver: driver.quit()

5.4 集成Allure生成漂亮测试报告

光有测试结果还不够,我们需要直观的报告来展示通过率、失败原因、甚至操作截图。

  1. 安装Allure:pip install allure-pytest,并下载Allure命令行工具。
  2. conftest.py中为失败用例自动截图:
    @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield rep = outcome.get_result() if rep.when == "call" and rep.failed: # 获取driver,这里需要根据你的fixture名称调整 driver = item.funcargs.get('init_driver') if driver: screenshot = driver.get_screenshot_as_base64() allure.attach(screenshot, name="失败截图", attachment_type=allure.attachment_type.PNG)
  3. 运行测试时添加参数:pytest test_cases/ --alluredir=./reports/allure-results
  4. 生成并打开报告:allure serve ./reports/allure-results

这样,每次运行测试后,都能看到一个包含详细步骤、截图和错误日志的HTML报告,非常利于问题分析和结果展示。

6. 高级技巧与稳定性实战

框架搭好了,但要写出能在不同环境稳定运行的脚本,还需要掌握以下高级技巧。

6.1 等待机制:告别“NoSuchElementException”

脚本不稳定的头号元凶就是元素还没加载出来,代码就去操作了。Appium提供了几种等待方式:

  1. 强制等待time.sleep(n)。简单粗暴但低效,不推荐在正式脚本中使用,仅用于临时调试。
  2. 隐式等待driver.implicitly_wait(10)。设置一个全局等待时间,在查找任何元素时,如果没立刻找到,会轮询查找直到超时。缺点是它只对find_element生效,且不够灵活。
  3. 显式等待(推荐):针对特定元素和条件进行等待,最灵活高效。
    from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 等待登录按钮可点击,最多等10秒,每0.5秒检查一次 login_btn_locator = (AppiumBy.ID, "com.example.app:id/login") wait = WebDriverWait(driver, 10, poll_frequency=0.5) login_button = wait.until(EC.element_to_be_clickable(login_btn_locator)) login_button.click()
    常用的条件(EC)还有:presence_of_element_located(元素存在),visibility_of_element_located(元素可见)等。在BasePage中封装显式等待是提升脚本稳定性的关键

6.2 处理弹窗、权限请求和混合应用

  • 系统弹窗/权限请求:如“允许访问相册”、“允许发送通知”。这些弹窗不属于你的App,需要用driver.switch_to.context('NATIVE_APP')确保上下文在原生层,然后用原生定位方式去点击“允许”或“拒绝”按钮。可以写一个通用的弹窗处理方法。
  • 混合应用(Hybrid App):App内嵌了WebView(H5页面)。你需要切换上下文:
    1. 获取所有上下文:contexts = driver.contexts
    2. 切换到WebView上下文:driver.switch_to.context('WEBVIEW_com.example.app')
    3. 此时,你可以像Selenium一样使用driver.find_element(By.CSS_SELECTOR, ...)来定位H5元素。
    4. 操作完切回原生上下文:driver.switch_to.context('NATIVE_APP')

6.3 并行测试与多设备管理

当用例越来越多时,串行执行太慢。我们可以用pytest-xdist插件实现并行执行。同时,结合Appium Grid或第三方云测平台,可以实现一套脚本在多台不同设备上同时运行。

简易并行示例

  1. 安装:pip install pytest-xdist
  2. 运行:pytest test_cases/ -n 3# 使用3个worker并行执行

多设备思路:在conftest.py中,根据传入的参数(如通过pytest命令行参数或环境变量)来加载不同的desired_capabilities(指定不同的deviceNameudid)。

6.4 数据驱动与参数化

使用@pytest.mark.parametrize装饰器,可以轻松实现数据驱动测试。

import pytest test_data = [ ("user1", "pass1", "登录成功"), ("user1", "wrong_pass", "密码错误"), ("", "pass1", "用户名不能为空"), ] @pytest.mark.parametrize("username, password, expected", test_data) def test_login_with_data(username, password, expected, init_driver): driver = init_driver login_page = LoginPage(driver) login_page.login(username, password) if expected == "登录成功": assert HomePage(driver).is_displayed() else: assert expected in login_page.get_error_message()

这样,你只需要维护一个数据列表,就能自动生成多个测试用例,极大提高了测试覆盖率。

7. 常见问题排查与避坑指南

这里记录了我踩过的一些典型坑和解决方法,希望能帮你节省大量调试时间。

7.1 连接与会话问题

问题现象可能原因解决方案
Could not find a connected Android device1. 设备未通过USB连接或未开启USB调试。
2. 模拟器未启动。
3. ADB服务异常。
1. 执行adb devices确认设备列表。真机需开启“开发者选项”和“USB调试”。
2. 启动模拟器。
3. 重启ADB:adb kill-server&&adb start-server
An unknown server-side error occurredDesired Capabilities 配置错误,如包名/Activity名不对,或使用了不支持的参数。1. 仔细检查Capabilities拼写和值。
2. 查看Appium Server日志的详细错误信息,通常会有明确提示。
3. 对于Appium 2.x,确保已安装对应驱动(uiautomator2)。
Original error: Could not find 'adb.exe'ANDROID_HOMEPATH环境变量未正确配置。确保%ANDROID_HOME%\platform-tools已添加到系统PATH,并重启终端。

7.2 元素定位与交互问题

问题现象可能原因解决方案
NoSuchElementException1. 元素确实不存在。
2. 页面未加载完。
3. 元素在WebView或Flutter等非原生容器内。
4. 页面有多个相同特征的元素。
1. 用Appium Inspector确认元素是否存在及其属性。
2. 添加显式等待
3. 切换上下文(对于WebView)或使用Flutter Driver等专用框架。
4. 使用find_elements获取列表后按索引选择,或使用更精确的XPath。
Element is not clickable at point1. 元素被遮挡(如弹窗、蒙层)。
2. 元素实际不可交互(如enabled=false)。
1. 先关闭遮挡物。
2. 使用driver.execute_script('mobile: clickGesture', {...})等Appium扩展命令强制点击。
3. 尝试点击元素的父级或子级元素。
输入框无法输入中文默认键盘可能不支持或未激活。1. 在Capabilities中设置unicodeKeyboard: TrueresetKeyboard: True
2. 或者,先点击输入框,然后使用adb shell input text '中文'命令注入文本(需切换回原生上下文)。

7.3 脚本稳定性问题

  • 问题:脚本在本地跑得好好的,在CI/CD流水线或另一台机器上就失败。
  • 排查
    1. 环境一致性:确保CI环境与本地环境的JDK、SDK、Node.js、Appium版本一致。使用Docker镜像是最佳实践。
    2. 设备状态:脚本开始前,强制清理App数据 (adb shell pm clear com.example.app),并重启App,保证初始状态干净。
    3. 依赖网络:所有操作(特别是断言)不要依赖网络图片或内容是否加载完成,而是依赖UI元素的状态。
    4. 截图和日志:在关键步骤和失败时自动截图,并打印详细的Appium Server日志和客户端日志。使用driver.get_screenshot_as_file()和Python的logging模块。

7.4 性能与效率优化

  • 减少不必要的截图:截图很耗时,只在失败或关键检查点截图。
  • 使用更稳定的定位器:优先用ID,避免用可能变化的XPath索引(如[1],[2])。
  • 合理使用等待:多用显式等待,少用隐式等待,杜绝死等 (time.sleep)。
  • 用例独立性:每个用例都应该是独立的,可以单独运行。使用setup/teardownfixture确保用例之间不互相影响。

最后,记住自动化测试是一个持续迭代的过程。不要试图一开始就自动化100%的用例。从最核心、最稳定、执行频率最高的冒烟测试用例开始,逐步扩大范围。在编写脚本上投入的时间,会在第N次回归执行时赚回来。保持脚本的简洁和可维护性,定期重构,让它成为你测试工作中的得力助手,而不是负担。

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

相关文章:

  • 如何用adb 查看设备是debug版本还是user版本?
  • AI安全能力管控:模型输出过滤与上下文隔离技术解析
  • 别再凭感觉选MOS管了!手把手教你用Excel搞定损耗计算与选型(附模板)
  • 别再复制粘贴了!手把手教你用Unicode字符搞定Word、Markdown里的上标下标
  • AI驱动自动化测试生成:Cover-Agent原理、实战与避坑指南
  • 基于Playwright与图像对比的自动化视觉回归测试实战指南
  • 线性回归:可解释性驱动的业务建模基石
  • JMeter接口测试从入门到精通:核心组件解析与实战指南
  • Claude for Windows桌面版安装与Claude Code编程实战指南
  • 机器学习需要多少数据?看任务类型、质量与建模策略
  • 25K+ Star!一个开源的通用 SQL 客户端工具!
  • 【操作系统】死锁的基本概念与必要条件
  • AI代理运行时:从事件日志到凭证隔离的工程范式
  • 如何快速提升《怪物猎人:世界》游戏体验:智能辅助工具的完整指南
  • Mythos模型:AI安全能力跃迁与运行时对齐挑战
  • PKHeX-Plugins:宝可梦数据自动化校验与生成引擎的技术架构深度解析
  • 市面上有哪些是真正靠谱的降AIGC工具(顺利通过高校AIGC审核)
  • 基于改进YOLOv8的船舶检测分类系统:从原理到工程实践
  • AI神话拆解指南:从能力边界到落地现实
  • MoE架构揭秘:大模型如何实现2%参数高效激活
  • Tree-GRPO:用决策树重构强化学习训练范式
  • AI加速的本质是认知压缩,不是算力堆叠
  • Python自动化测试实战:从零到一构建测试框架的完整学习路径
  • MGIE:苹果端侧AI推理的多粒度调度范式
  • CNN组件物理直觉:从shape变化到显存占用的工程化理解
  • Playwright自动化测试与爬虫实战:从入门到精通
  • NEAT与Hindsight Experience Replay融合方法
  • 机器学习数据量真相:不是数量,而是信息精度与任务匹配度
  • 从SocialFish钓鱼攻击原理到企业级安全防护体系构建
  • C# Web自动化测试进阶:从Selenium到Atata框架的实践指南