Appium API 核心功能与实战技巧:从元素定位到混合应用测试
2026/8/7 14:28:11 网站建设 项目流程

1. 项目概述:为什么我们需要深入理解 Appium API?

如果你正在做移动端自动化测试,或者刚刚接触 Appium,你大概率已经写过类似driver.find_element(By.ID, “com.example:id/button”).click()这样的代码。这行代码背后,就是 Appium API 在发挥作用。但 Appium 的 API 远不止find_elementclick这么简单。它是一套庞大而精密的工具集,理解并熟练运用这些 API,是区分“能用 Appium”和“能用好 Appium”的关键。

我见过不少测试脚本,虽然能跑通,但充斥着硬编码的等待、脆弱的定位方式和重复的代码。究其原因,往往是对 Appium 提供的丰富 API 缺乏了解,只能使用最基础的几个方法。实际上,Appium 基于 W3C WebDriver 协议,并针对移动端特性进行了大量扩展,提供了从设备控制、上下文切换、手势操作到高级定位策略等一系列强大功能。掌握这些 API,不仅能写出更健壮、更高效的脚本,还能应对各种复杂的测试场景,比如混合应用测试、跨应用交互、性能数据获取等。

这篇文章,我将结合自己多年的实战经验,为你系统梳理 Appium 框架中最常用、最核心的自动化 API。我不会仅仅罗列方法名,而是会深入每个 API 的设计意图、适用场景、内部原理以及实际使用中的“坑”和技巧。我们的目标是,让你看完后,能立刻将这些 API 应用到你的项目中,解决实际问题。

2. Appium API 的基石:会话管理与能力配置

在调用任何具体的自动化操作之前,我们必须先与 Appium 服务器建立连接,并告诉它我们想要自动化什么。这个过程的核心就是创建会话(Session)和配置能力(Capabilities)。

2.1 理解 Capabilities:自动化任务的“需求说明书”

Capabilities 是一组键值对,它定义了自动化会话的所有基本属性。你可以把它想象成一份给 Appium 服务器的“需求说明书”,上面写着:“我要测试一个 Android 应用,包名是 com.demo.app,设备是模拟器,系统版本是 12……”

常用核心 Capabilities 解析:

  1. 平台标识类

    • platformName:必填项。指定操作系统平台,如AndroidiOS。这是 Appium 选择对应驱动程序(Driver)的根本依据。
    • automationName:强烈建议指定。指定使用哪个自动化引擎。对于 Android,通常是UiAutomator2(Appium 2.x 默认)或Espresso;对于 iOS,则是XCUITest。明确指定可以避免因 Appium 版本默认值变化带来的意外行为。
  2. 设备标识类

    • deviceName: Android 上可任意命名,iOS 上需使用xcrun simctl list devicesinstruments -s devices列出的设备名称。
    • udid:真机调试必备。设备的唯一标识符。Android 可通过adb devices获取,iOS 可通过xcrun simctl list devices或连接 iTunes/Xcode 查看。
    • platformVersion: 设备系统版本,如12.0
  3. 应用标识类

    • app: 待测应用的安装包路径(本地路径或远程 URL)。Appium 会尝试安装此应用到设备。
    • appPackage&appActivity: (Android 专用)直接启动已安装应用中的特定 Activity。appPackage是应用包名,appActivity是入口 Activity(通常为MainActivity)。使用这对参数可以跳过安装步骤,直接启动。
    • bundleId: (iOS 专用)直接启动已安装应用,相当于 Android 的appPackage
  4. 其他重要配置

    • noReset: 设置为true时,会话结束后不会重置应用状态(如不清除应用数据)。这在测试需要登录状态的连续场景时非常有用。
    • fullReset: 设置为true时,会话开始前会卸载并重新安装应用。通常用于确保一个绝对干净的环境。
    • newCommandTimeout: 客户端发送两条命令之间的最大等待时间(秒),超时则服务器会自动结束会话。默认 60 秒,在脚本有长时间等待(如下载文件)时可能需要调大。

实操心得与避坑指南:

  • appvsappPackage/Activity的选择:如果应用需要每次从干净状态测试,或者应用未安装,使用app。如果应用已安装,且你希望保留其数据(如缓存、登录态)进行快速冒烟测试,使用appPackage/ActivitybundleId效率更高。
  • 真机调试务必使用udid:仅靠deviceName在连接多台同型号真机时无法区分,会导致连接错误。udid是唯一可靠的标识。
  • automationName明确化:随着 Appium 版本迭代,默认的自动化引擎可能改变。在 Capabilities 中显式指定automationName,可以保证脚本在不同版本的 Appium 服务器上行为一致,这是一个很好的实践。
  • Capabilities 的传递:在 Python 中通常用字典,Java 中用DesiredCapabilities类。确保值的类型正确,特别是布尔值和数字。

一个典型的 Python 示例:

from appium import webdriver from appium.options.android import UiAutomator2Options # 使用新的 Options 模式 (推荐) options = UiAutomator2Options() options.platform_name = ‘Android’ options.automation_name = ‘UiAutomator2’ options.device_name = ‘Pixel_5_API_33’ # 模拟器名称 options.app = ‘/path/to/your/app.apk’ options.no_reset = True # 不重置应用 # 建立连接,创建会话 driver = webdriver.Remote(‘http://localhost:4723’, options=options)

2.2 会话的生命周期管理

创建driver对象的过程就是发起 HTTP 请求到 Appium 服务器创建新会话的过程。服务器会根据 Capabilities 启动对应的驱动,准备好设备或模拟器,并返回一个唯一的session_id

关键 API:

  • webdriver.Remote(command_executor, options):创建会话的核心构造函数。
  • driver.quit()最重要的 API 之一。它用于结束整个会话,释放所有资源,包括关闭应用(取决于noReset/fullReset设置)、断开设备连接等。务必在测试结束时调用,否则会导致设备端口占用、会话泄露。

注意driver.close()driver.quit()有本质区别。close()通常用于关闭当前窗口或标签页,在移动端原生应用上下文中,它的行为可能不确定或等同于quit。对于移动自动化,总是使用quit()来结束测试是最安全、最标准的做法。

3. 元素定位:自动化脚本的“眼睛”

找到界面上的元素,是与之交互的前提。Appium 支持丰富的定位策略,其中许多继承自 Selenium,并增加了移动端特有的策略。

3.1 八大核心定位策略详解

  1. ID / Accessibility ID (推荐首选)

    • 原理:在 Android 中对应resource-id,在 iOS 中对应accessibility identifier。这是开发者为控件赋予的唯一标识,定位速度最快,且通常不受UI变化(如文本改变)影响。
    • API:find_element(AppiumBy.ACCESSIBILITY_ID, “id_value”)find_element(By.ID, “id_value”)(Appium 客户端库做了兼容)。
    • 技巧:督促开发团队为关键交互元素添加有意义的 Accessibility ID/Resource ID,这是提升自动化脚本稳定性的最有效手段。
  2. XPath (功能强大但需慎用)

    • 原理:通过 XML 路径语言在页面层级结构中定位元素。功能极其强大,可以定位到任何元素,但性能相对较差,且易受UI结构微小变动的影响。
    • API:find_element(By.XPATH, “//android.widget.Button[@text=‘登录’]”)
    • 避坑
      • 避免绝对路径:如/hierarchy/android.widget.FrameLayout/...,这种路径极其脆弱。
      • 使用相对路径和属性结合//*[@resource-id=‘com.example:id/title’]
      • 谨慎使用contains和索引:如//android.widget.TextView[contains(@text, ‘部分文字’)]//android.widget.Button[1],它们在UI调整时很容易失效。
  3. Class Name

    • 原理:通过控件类型定位,如android.widget.EditTextXCUIElementTypeButton
    • API:find_element(By.CLASS_NAME, “android.widget.Button”)
    • 场景:通常用于查找特定类型的全部元素,或与其他条件结合使用。单独使用通常不唯一。
  4. Name (iOS) / Text (Android 辅助)

    • 注意:W3C 标准中已不推荐By.NAME。在 iOS 中,它查找name属性(通常也是 Accessibility ID)。在 Android 中,更常用By.ANDROID_UIAUTOMATOR来通过文本定位。
  5. Android 专属定位器

    • UiAutomator (强大灵活)
      • API:find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().text(“登录”)’)
      • 原理:直接调用 Android 底层的 UiAutomator API,支持丰富的选择器,如text,className,resourceId,description,clickable等,并支持链式调用和父子关系定位。这是定位复杂 Android 元素的利器
      • 示例new UiSelector().resourceId(“com.example:id/list”).childSelector(new UiSelector().className(“android.widget.TextView”).instance(2))
    • View Tag / Data Matcher:使用较少,通常用于特定框架(如 Espresso)。
  6. iOS 专属定位器

    • iOS Class Chain (推荐)
      • API:find_element(AppiumBy.IOS_CLASS_CHAIN, ‘**/XCUIElementTypeButton[label == “确认“]’)`
      • 原理:类似 XPath,但语法更简洁,性能通常优于 XPath,是 iOS 上定位复杂元素的优选。
    • iOS Predicate String (功能最强)
      • API:find_element(AppiumBy.IOS_PREDICATE, ‘label == “确认” AND enabled == true’)
      • 原理:使用 NSPredicate 语法,可以通过元素的几乎所有属性(label, value, name, enabled, visible 等)及其组合进行定位,支持比较运算符和模糊匹配。
      • 示例type == “XCUIElementTypeStaticText” AND value BEGINSWITH “用户”
  7. CSS Selector (仅限 Web/Hybrid 的 WebView 上下文):在切换到 WebView 上下文后,用于定位网页元素。

  8. Link Text / Partial Link Text (仅限 Web/Hybrid):用于定位超链接。

定位策略选择优先级建议:

  1. Accessibility ID / Resource ID:稳定、快速,首选。
  2. iOS Predicate / Android UiAutomator:功能强大,灵活性高,当 ID 不可用时作为次选。
  3. XPath / iOS Class Chain:在复杂层级定位时使用,但需精心编写。
  4. Class Name + 其他属性:作为辅助。
  5. 避免依赖绝对坐标、索引、纯文本(除非文本是唯一且不变的)

3.2 元素等待:解决“找不到元素”的银弹

直接查找元素 (find_element) 如果元素未立即出现会立刻抛出NoSuchElementException。因此,显式等待(Explicit Wait)是编写健壮自动化脚本的黄金法则

核心 API:WebDriverWaitexpected_conditions(EC)

from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 等待最多10秒,直到元素出现并可见 wait = WebDriverWait(driver, 10) login_button = wait.until( EC.visibility_of_element_located((AppiumBy.ACCESSIBILITY_ID, “login_button”)) ) login_button.click()

常用的 Expected Conditions:

  • visibility_of_element_located: 元素可见(宽高大于0)。
  • presence_of_element_located: 元素存在于 DOM/层级中(可能不可见)。
  • element_to_be_clickable: 元素可见且可点击。
  • text_to_be_present_in_element: 元素包含特定文本。

实操心得:

  • 全局设置隐式等待需谨慎driver.implicitly_wait(10)会对所有find_element操作生效,可能会掩盖某些问题并增加整体执行时间。更推荐在需要的地方使用显式等待
  • 自定义等待条件:当内置条件不满足时,可以传入自定义函数(lambda或函数对象)。
    # 等待元素消失 wait.until(lambda d: len(d.find_elements(By.ID, “loading”)) == 0)
  • 超时时间设置:根据网络、设备性能和操作类型合理设置,通常 10-30 秒。对于加载很慢的页面或操作,可以单独设置更长的等待。

4. 元素交互:让应用“动”起来

定位到元素后,下一步就是与之交互。Appium 提供了丰富的交互 API。

4.1 基础交互 API

  1. 点击与输入

    • element.click(): 点击元素。
    • element.send_keys(“text”): 向输入框输入文本。
    • element.clear(): 清除输入框内容。
    • 技巧:在send_keys前先clear(),可以确保输入框状态干净。但对于某些应用,clear()可能触发校验,需根据实际情况决定。
  2. 获取元素状态与信息

    • element.text: 获取元素的显示文本(对于输入框,是其value属性)。
    • element.get_attribute(“attributeName”): 获取元素属性,如resource-id,class,enabled,selected,checked,bounds(返回元素坐标)等。这是探查元素属性的主要方法。
    • element.is_displayed(): 元素是否可见。
    • element.is_enabled(): 元素是否可用。
    • element.is_selected(): 元素是否被选中(如复选框)。
    • 注意text属性可能为空,特别是对于非文本控件。get_attribute更通用。

4.2 高级手势操作 API (TouchAction / W3C Actions)

对于滑动、长按、拖拽、多点触控等复杂手势,Appium 早期提供了TouchAction类,现在更推荐使用符合 W3C 标准的ActionChains(在 Appium Python 客户端中为W3CActions)。

W3C Actions 示例(滑动):

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 from selenium.webdriver.common.actions.pointer_actions import PointerActions # 创建指针设备(触摸屏) touch = PointerInput(PointerInput.KIND_TOUCH, “finger”) actions = ActionBuilder(driver, mouse=touch) # 执行滑动:按下 -> 移动 -> 释放 actions.pointer_action\ .move_to_location(start_x, start_y)\ .pointer_down()\ .pause(0.1)\ .move_to_location(end_x, end_y)\ .pointer_up() actions.perform()

常用手势封装函数(实用技巧):由于 W3C Actions 语法稍显繁琐,在实际项目中我们通常会封装一些常用的手势方法。

def swipe(driver, start_x, start_y, end_x, end_y, duration_ms=500): “”“从 (start_x, start_y) 滑动到 (end_x, end_y),持续 duration_ms 毫秒”“” touch = PointerInput(PointerInput.KIND_TOUCH, “touch”) actions = ActionBuilder(driver, mouse=touch) actions.pointer_action\ .move_to_location(start_x, start_y)\ .pointer_down()\ .pause(duration_ms / 1000)\ # 通过暂停时间来模拟滑动速度 .move_to_location(end_x, end_y)\ .pointer_up() actions.perform() # 使用:向下滑动屏幕 screen_size = driver.get_window_size() width, height = screen_size[‘width’], screen_size[‘height’] swipe(driver, width*0.5, height*0.8, width*0.5, height*0.2)

其他手势思路:

  • 长按:在pointer_down()后增加一个较长的pause(如 2 秒),再pointer_up()
  • 拖拽:类似于滑动,但通常是从一个可拖拽元素移动到目标区域。
  • 多点触控:需要创建多个PointerInput设备(如finger1,finger2),并在同一个ActionBuilder中编排它们的动作序列,最后一起perform()。逻辑较为复杂,使用频率相对较低。

4.3 系统按键与设备操作

Appium 提供了模拟物理按键的 API,这对于无法通过界面元素触发的操作(如返回、Home、菜单、音量键)至关重要。

核心 API:driver.press_keycode(keycode)

  • Android KeyCode:使用 Android 的KeyEvent常量。
    from appium.webdriver.extensions.android.nativekey import AndroidKey driver.press_keycode(AndroidKey.BACK) # 返回键 driver.press_keycode(AndroidKey.HOME) # Home键 driver.press_keycode(AndroidKey.ENTER) # 回车键 driver.press_keycode(AndroidKey.VOLUME_UP) # 音量+
  • iOS:iOS 的按键模拟有限,通常通过execute_script(‘mobile: pressButton’, {‘name’: ‘home’})等方式实现。

其他常用设备操作:

  • driver.get_clipboard()/driver.set_clipboard(): 获取和设置系统剪贴板内容。
  • driver.lock()/driver.unlock(): 锁定和解锁设备屏幕。
  • driver.orientation: 获取或设置屏幕方向 (LANDSCAPE,PORTRAIT)。
  • driver.get_window_size(): 获取屏幕分辨率,常用于计算滑动坐标。
  • driver.open_notifications(): (Android) 打开通知栏。
  • driver.hide_keyboard(): 尝试隐藏软键盘。有时需要指定键盘关闭策略。

5. 上下文(Context)处理:征服混合应用与 WebView

这是移动自动化特有的重要概念。一个应用内可能同时存在:

  1. NATIVE_APP 上下文:原生控件构成的界面。
  2. WEBVIEW_<package_name> 上下文:内嵌的 WebView(浏览器组件)承载的网页内容。

相关 API:

  • driver.contexts: 获取当前会话中所有可用的上下文列表。
  • driver.current_context: 获取当前所在的上下文。
  • driver.switch_to.context(context_name): 切换到指定的上下文。

混合应用测试工作流:

  1. 在原生上下文中操作,进入包含 WebView 的页面。
  2. 调用driver.contexts,查看是否出现了WEBVIEW_开头的上下文。注意:WebView 必须处于调试模式(setWebContentsDebuggingEnabled(true))才能被 Appium 识别。
  3. 切换到目标WEBVIEW上下文。
  4. 此时,你可以使用 Selenium 的 WebDriver API(如By.CSS_SELECTOR,By.LINK_TEXT)来定位和操作网页中的元素。
  5. 操作完成后,切换回NATIVE_APP上下文以继续操作原生部分。

实操避坑:

  • 上下文切换时机:确保 WebView 页面已经完全加载完成后再尝试获取和切换上下文,否则可能找不到。
  • Chromedriver 匹配:对于 Android WebView,需要确保 Appium 使用的chromedriver版本与设备上 Chrome/WebView 的版本兼容。不匹配会导致无法连接或操作异常。Appium 通常能自动管理,但遇到问题时需要手动检查。
  • iOS 上的 WebView:原理类似,但驱动细节不同。

6. 高级特性与移动端专属 API

Appium 通过execute_script方法执行“移动端方法”(Mobile Commands),提供了大量原生操作能力。

6.1 滚动与查找 (mobile: scroll, mobile: scrollTo)

在列表中滚动查找元素是常见需求。虽然可以通过手势模拟,但 Appium 提供了更语义化的方法。

# 在 Android 上,滚动直到找到包含“某文本”的元素 driver.execute_script(‘mobile: scrollTo’, {‘strategy’: ‘-android uiautomator’, ‘selector’: ‘new UiSelector().textContains(“某文本”)’}) # 在 iOS 上,使用 Predicate 滚动查找 driver.execute_script(‘mobile: scroll’, {‘direction’: ‘down’, ‘predicateString’: ‘label CONTAINS “某文本”’}) # 更通用的滚动(基于方向) driver.execute_script(‘mobile: scroll’, {‘direction’: ‘down’}) # 或 ‘up’, ‘left’, ‘right’

6.2 后台运行与安装 (mobile: backgroundApp, mobile: installApp)

  • driver.background_app(seconds): 将当前应用置于后台 N 秒,然后唤醒。用于测试应用从后台恢复的状态。
  • driver.install_app(app_path): 安装应用。
  • driver.remove_app(app_id): 卸载应用。
  • driver.is_app_installed(bundle_id): 检查应用是否已安装。
  • driver.activate_app(bundle_id): 激活(切换到)指定应用。
  • driver.terminate_app(app_id): 终止应用进程。

6.3 文件操作 (mobile: pushFile, mobile: pullFile)

在设备和测试机之间传输文件,常用于准备测试数据或获取测试结果(如截图、日志)。

# 将本地文件推送到设备 data = “Hello, device!”.encode(‘utf-8’) driver.push_file(‘/sdcard/Download/test.txt’, data) # Android 路径 # 从设备拉取文件到本地 file_data = driver.pull_file(‘/sdcard/Download/test.txt’) with open(‘local_copy.txt’, ‘wb’) as f: f.write(file_data)

6.4 性能数据获取 (mobile: getPerformanceData)

获取应用的内存、CPU、网络等性能数据(仅限 Android,且需要应用有 profiling 权限)。

# 获取内存数据 performance_data = driver.get_performance_data(‘com.example.app’, ‘memoryinfo’, 10) print(performance_data)

6.5 查找图像 (mobile: findImageElement)

这是 Appium 的“图像识别”插件提供的功能(需安装images插件),用于在屏幕上通过模板图片查找元素。在元素无法通过常规属性定位时(如游戏界面、自定义绘制控件),可以作为最后的手段。

# 安装图像插件 appium plugin install images
# 使用图像匹配点击 driver.execute_script(‘mobile: findImageElement’, { ‘image’: ‘/path/to/template.png’, # 模板图片路径 ‘threshold’: 0.8, # 匹配阈值 (0-1) ‘multiple’: False })

注意:图像识别受屏幕分辨率、缩放、颜色变化影响较大,执行速度慢,且维护成本高(UI一变,模板图就要更新)。应作为备选方案,而非首选定位策略

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

即使熟悉了所有 API,在实际编写和运行脚本时,你依然会遇到各种各样的问题。这里记录了一些高频问题和解决思路。

7.1 元素定位失败问题排查表

问题现象可能原因排查步骤与解决方案
NoSuchElementException1. 元素确实不存在/未加载。
2. 定位器写错。
3. 页面有 WebView/Native 切换。
4. 元素在弹窗、新Activity或iframe内。
1. 使用driver.page_source或 Appium Inspector 查看当前页面结构,确认元素是否存在。
2. 检查定位器字符串,特别是引号、拼写。
3. 检查当前上下文 (driver.current_context),确认是否在正确的上下文中查找。
4. 尝试增加显式等待,确保元素加载完成。
5. 检查是否有弹窗遮挡。
StaleElementReferenceException之前找到的元素,其对应的 DOM/层级节点已失效(如页面刷新、元素被移除后重新添加)。1.最佳实践:采用“即时定位”模式,即每次操作前重新查找元素,避免将元素对象长期存储。
2. 如果必须存储,在再次使用前用try-except捕获异常,并重新查找。
定位到多个元素 (find_elements返回列表)使用的定位器不够精确,匹配到了多个元素。1. 使用更独特的属性(如唯一的resource-id)。
2. 使用父子层级关系缩小范围(如 XPath 或 UiAutomator 链)。
3. 使用find_elements获取列表后,通过索引或条件过滤出目标元素。
定位速度极慢1. 使用了复杂的 XPath,尤其是包含//contains的表达式。
2. 隐式等待时间设置过长。
1. 优化定位器,优先使用 ID,其次使用 UiAutomator/iOS Predicate。
2. 减少或取消全局隐式等待,改用针对性的显式等待。
iOS 上class chainpredicate无效语法错误或属性名不对。1. 使用 Appium Inspector 或driver.page_source确认元素的准确属性名(注意大小写)。
2. 参考苹果官方文档检查 NSPredicate 语法。

7.2 会话与连接问题

  • WebDriverException: Unable to create new service:通常意味着 Appium 服务器未启动,或指定的端口被占用。检查appium server是否运行,并确认客户端连接的地址和端口(默认http://localhost:4723)正确。
  • SessionNotCreatedException:创建会话失败。这是最常见的问题之一
    • 检查 Capabilities:确保所有必填项正确,特别是app路径存在且可读,udid对应已连接的设备,platformVersion与设备系统匹配。
    • 查看 Appium 服务器日志:这是最重要的调试信息!日志会明确告诉你失败原因,例如:app文件找不到、设备udid不存在、请求的自动化驱动 (automationName) 未安装等。
    • 驱动未安装:对于 Appium 2.x,需要手动安装平台驱动,如appium driver install uiautomator2appium driver install xcuitest
  • 脚本执行过程中连接断开:检查设备是否休眠、是否意外断开 USB、Appium 服务器进程是否稳定。可以尝试增加newCommandTimeout的值。

7.3 性能与稳定性优化技巧

  1. 使用UIAutomator2而非旧的UIAutomator1UiAutomator2是更现代、更稳定的 Android 驱动,除非应用兼容性问题,否则应作为默认选择。
  2. 合理使用noResetfullReset:在调试阶段使用noReset=true可以节省安装时间。在 CI/CD 流水线中,使用fullReset=true保证环境纯净。
  3. 避免sleep:绝对不要使用固定的time.sleep()进行等待。这会导致脚本效率极低且不稳定。始终坚持使用显式等待
  4. 元素操作前增加可见/可点击检查:特别是在点击前,使用wait.until(EC.element_to_be_clickable(...)),这比单纯的visibility检查更能避免误点击。
  5. 利用driver.implicitly_wait设置一个较小的全局超时:例如 2-5 秒,作为找不到元素时的“安全网”,但主要逻辑仍依赖显式等待。
  6. 截图和日志是救星:在关键步骤前后、尤其是失败时,使用driver.save_screenshot(‘step1.png’)截图。同时,将 Appium 服务器日志和客户端日志收集起来,便于回溯分析。

7.4 与测试框架集成

Appium API 本身不负责断言和测试组织。你需要将其与单元测试框架(如 Python 的pytest/unittest, Java 的TestNG/JUnit)结合。

一个简单的pytest集成示例:

import pytest from appium import webdriver from appium.options.android import UiAutomator2Options @pytest.fixture(scope=“session”) def appium_driver(): “”“初始化 Appium 驱动,整个测试会话只执行一次”“” options = UiAutomator2Options() # ... 配置你的 capabilities driver = webdriver.Remote(‘http://localhost:4723’, options=options) yield driver # 将 driver 对象提供给测试用例 driver.quit() # 所有测试结束后退出 def test_login(appium_driver): “”“一个简单的登录测试用例”“” driver = appium_driver # 使用 driver 进行各种操作 driver.find_element(By.ID, “username”).send_keys(“testuser”) driver.find_element(By.ID, “password”).send_keys(“pass123”) driver.find_element(By.ID, “login_btn”).click() # 使用 pytest 的 assert 进行验证 welcome_text = driver.find_element(By.ID, “welcome”).text assert “testuser” in welcome_text

通过这样的组织,你可以利用测试框架的夹具管理、参数化、断言、报告等功能,构建出结构清晰、易于维护的自动化测试套件。记住,Appium API 是你的“手”和“眼睛”,而测试框架是你的“大脑”和“记录员”,两者结合才能发挥最大威力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询