当前位置:首页 > 技术 > 正文内容

Appium自动化测试核心操作指南:定位、交互与移动端高级功能

访客 技术 2026年7月7日 1

环境初始化配置

启动Appium会话前需完成基础设置,确保设备已连接并被识别:

from appium import webdriver

desired_caps = {
    "platformName": "Android",
    "platformVersion": "6.1.1",
    "appPackage": "com.ss.android.article.news",
    "appActivity": "com.ss.android.article.news.activity.MainActivity",
    "deviceName": "JAD-AL50",
    "noReset": True,
    "unicodeKeyboard": True,
    "resetKeyboard": True,
    "automationName": "UiAutomator2"
}

driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)

元素定位策略

使用 AppiumBy 模块实现精准定位,支持多种方式:

from appium.webdriver.common.appiumby import AppiumBy
  • ID定位:通过唯一资源标识符查找元素
  • Class名称:适用于控件类型明确的场景,但易因重复命名导致误判
  • Content-desc属性:用于描述控件用途,推荐在开发中添加
  • UI Automator表达式:灵活组合条件,如文本、类名、资源ID等
  • XPath定位:支持属性匹配与层级嵌套,但性能较低,建议慎用

UI Automator 高级用法示例

# 通过文本内容定位
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("重置")')

# 包含关键字模糊匹配
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().textContains("重")')

# 组合条件定位(文本+资源ID)
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("重置").resourceId("com.android.settings:id/title")')

层级与兄弟元素定位

# 父元素下子元素
'//*[@resource-id="com.android.launcher3:id/tv_search"]/android.widget.TextView'

# 兄弟元素定位
'//*[@resource-id="com.android.launcher3:id/tv_search"]/../android.widget.RelativeLayout'

元素基本操作

常用交互方法包括点击、输入、清除及信息提取:

element = driver.find_element(AppiumBy.ID, "com.android.launcher3:id/tv_search")

element.click()              # 触发点击事件
element.clear()              # 清空输入框
element.send_keys("测试内容") # 输入文本
print(element.text)          # 获取显示文本
print(element.get_attribute("class"))  # 获取属性值
print(driver.get_window_size())  # 获取屏幕分辨率
driver.get_screenshot_as_file("screenshot.png")  # 截图保存

触控与手势操作

通过 TouchAction 实现复杂用户行为模拟:

from appium.webdriver.common.touch_action import TouchAction

action = TouchAction(driver)
action.press(x=155, y=706).wait(500).move_to(x=840, y=706).release().perform()

多点触控缩放(放大/缩小)

from appium.webdriver.common.multi_action import MultiAction

a1 = TouchAction(driver).press(x=0.2, y=0.2).move_to(x=0.4, y=0.4).release()
a2 = TouchAction(driver).press(x=0.8, y=0.8).move_to(x=0.6, y=0.6).release()

MultiAction(driver).add(a1, a2).perform()

滑动与拖拽

# 基于坐标滑动
size = driver.get_window_size()
driver.swipe(size['width']*0.9, size['height']*0.5, size['width']*0.1, size['height']*0.5, 1000)

# 滚动至目标元素
start_el = driver.find_element(MobileBy.XPATH, '//android.widget.LinearLayout[1]')
end_el = driver.find_element(MobileBy.XPATH, '//android.widget.LinearLayout[10]')
driver.scroll(start_el, end_el, 3000)

手机系统级操作

对设备状态进行控制与监控:

# 获取当前网络状态
print(driver.network_connection)

# 设置网络模式(飞行模式)
driver.set_network_connection(1)

# 模拟按键操作
driver.press_keycode(24)  # 音量加
driver.press_keycode(25)  # 音量减
driver.press_keycode(4)   # 返回键

# 打开通知栏
driver.open_notifications()

Toast消息识别

利用XPath捕获临时提示信息:

try:
    toast_locator = (MobileBy.XPATH, '//*[contains(@text,"密码错误")]')
    WebDriverWait(driver, 10, 0.02).until(EC.presence_of_element_located(toast_locator))
    print(driver.find_element(*toast_locator).text)
except:
    print("未检测到Toast")

H5页面自动化处理

识别并切换至Web View上下文:

print(driver.contexts)  # 查看可用上下文 ['NATIVE_APP', 'WEBVIEW_com.xkw.client']

# 切换到H5页面
driver.switch_to.context('WEBVIEW_com.xkw.client')

# 定位网页元素
driver.find_element(MobileBy.CLASS_NAME, 'login').click()

# 切回原生应用
driver.switch_to.context('NATIVE_APP')

等待机制

合理使用显式等待提升脚本稳定性:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((AppiumBy.ID, "target_id"))
)

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。