Appium自动化测试核心操作指南:定位、交互与移动端高级功能
环境初始化配置
启动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"))
)