安卓 UI自动化测试
这是基于appium库 + python + windows 代码来实现的 UI自动化测试。(python代码 及 python IDE(pycharm) 默认是安装的,也会基本使用。)
一、搭建测试环境
- 安装adb 详细教程
- 安装node.js 点击下载 .msi 文件可以直接安装
- 安装Android SDK 详细教程
- 安装appium库,它开源的、跨平台的测试框架 appium-python库 建议不要下载过高的版本 兼容性较差,可以使用2.11.1的版本,通用性较好
- 下载后解压;
- cmd 进入appium-python-client 的解压路径下,输入:python setup.py install 回车, 等待安装成功
- 可以在cmd 中用pip list 查看是否安装成功(pip命令是 安装python时选装工具)。 <也可以用pip安装 pip install appium-python-client>
- 安装selenium库 用pip 安装即可 (我使用的版本4.15.2)
- appium-desktop(appium服务) appium-desktop下载 在菜单View里可以这是中文语言
- 安装 python (3.7+) 及 pycharm
- 安装 模拟器 (真机忽略)
二、UI自动化
1. 运行appium 点击start server,启动appium服务器
2. 安装需要测试的软件
3. 连接手机(或模拟器 adb 连接)
安卓真机,需要在设置里面进入关于手机,里面连击版本号,会提示手机已进入开发者模式,在回到设 置中查找开发者选项,开启USB调试,再次通过数据线连接手机即可。(如果提示手机连接模式,应该 选择文件传输,不能选择仅充电)
platformName :Android 【这里是Android环境】
platformVersion:4.4.2 【在cmd窗口输入命令:adb shell getprop ro.build.version.release查看版本或者在夜神摸拟器系统信息菜单查看版本号】
deviceName:驱动名称 【在cmd窗口输入命令:adb devices查看名称】
appPackage:包名 【在cmd窗口输入命令:aapt dump badging D:\test\taobao.apk | findstr package(网上下载的taobao.apk文件)】
appActivity:启动栈 【在cmd窗口输入命令:aapt dump badging D:\test\taobao.apk | findstr launchable(网上下载的taobao.apk文件)】
也可以使用包名查看器.apk 查看
4. 元素定位 1 :
5. 元素定位 2 :uiautomator
Android SDK自带的一个工具,在sdk的tools目录下(一定关闭appium-desktop的自带的定位工具后打 开,否则连接不上模拟器/真机 )找到sdk下的tools里面的uiautomatorviewer.bat
可以把adb 语句 写在bat文件中一键执行:新建txt文本,复制下面命令,保存退出,修改txt文件后缀为 .bat ,回车确定 ,双击执行。
chcp 65001
rem 获取UI
adb shell uiautomator dump /sdcard/sc.uix
rem 下载UI
adb pull /sdcard/sc.uix C:\Users\Administrator\Desktop
rem 获取图片
adb shell screencap -p /sdcard/sc.png
rem 下载图片
adb pull /sdcard/sc.png C:\Users\Administrator\Desktop
pause
6. 代码执行 appium版本=2.11.1, python版本=3.10
# coding = utf-8
from appium import webdriver
dis = {
"platformName": "Android",
"platformVersion": "8.1.0",
"deviceName": "d40cac3b",
# appPackage,appActivity 不要 就可以 连接当前的手机界面
"appPackage": "com.shiliu.freeplay.playlet",
"appActivity": "com.freeplay.playlet.module.splash.SplashActivity",
'udid':'127.0.0.1:7555', # 填写通过命令行 adb devices 查看到的udid
'noRest': True, # 是否重置APP
'unicodeKeyboard': True # 是否支持中文输入
'newCommandTimeout':30 # 30秒没发送新命令就断开连接
}
# 启动
driver = webdriver.Remote('http://localhost:4723/wd/hub', dis)
7. 一些方法
appium的一些方法 主要的是一些元素定位和操作的方法
# coding = utf-8
from appium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Remote('http://localhost:4723/wd/hub', {})
# 通过id定位 取resource-id的属性值,替换到xxx
driver.find_element(By.ID," xxxx ")
# 通过class_name定位, 取class的属性值,替换到xxx
driver.find_element(By.CLASS_NAME," xxxx ")
# 通过xpath定位 取xpath的属性值,替换到xxx
driver.find_element(By.XPATH," xxxx ")
# 通过link_text定位 取text属性值,替换到xxx
driver.find_element(By.LINK_TEXT," xxxx ")
# 通过css_selector定位(webview)
driver.find_element(By.CSS_SELECTOR,"XXXX")
# 通过name定位(webview) web view容器中的html页面可以用name定位,native并没有name属性
driver.find_element(By.NAME," xxxx ")
"""
多个元素定位
方法:find_elements
用法:与find_element方式一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果 例如:通过ID定位到多个元素,我想点击第一个元素
"""
driver.find_elements(By.ID,"xxxxx")[0].click()
# 或采用以下写法
list1 = driver.find_elements(By.ID,"xxxxx")
list1[0].click()
"""
元素操作
找到元素后可以对元素进行的操作
"""
# 点击操作,也可以用tab实现点击操作
driver.find_element(By.ID," xxxx ").click()
# 清空输入框内容
driver.find_element(By.ID," xxxx ").clear()
# 输入框内输入内容
driver.find_element(By.ID," xxxx ").send_keys("test content")
# 获得元素的text内容
result = driver.find_element(By.XPATH," xxxx").text
print(result)
# 通过传入xx属性,获取xx属性值
driver.find_element(By.ID,' xxxx ').get_attribute('text')
wu = driver.find_element(By.ID,' xxxx ')
dic = wu.size
# ---> return dict {"height":125, "width": 256} 组件的大小
dic = wu.location
# ---> return dict {"x":456, "y":1024} 组件的坐标
# 导入 TouchAction 就可以进行点击、划动等操作了
from appium.webdriver.common.touch_action import TouchAction
"""
press(x, y): 长按,传入坐标
release(): 在当前位置释放(松开)。
move_to(x, y): 移动到指定的屏幕坐标(x, y),传入坐标
tap(element=None, x=None, y=None, count=1): 点击指定的元素或屏幕坐标。可以通过元素locator或坐标参数来指定位置。可以设置点击的次数。
long_press(element=None, x=None, y=None, duration=None): 长按指定的元素或屏幕坐标。可以通过元素locator或坐标参数来指定位置。可以设置长按的持续时间。
wait(ms): 等待指定的时间(以毫秒为单位)。
perform(): 执行之前定义的所有TouchAction操作。
这些方法可以根据需要进行组合和调用,从而实现各种触摸操作的模拟。请注意,这些方法都是链式的,可以连续调用多个方法来构建多步操作
"""
# 根据size,location 计算 坐标,进行点击
TouchAction(driver).tap(x=int(wu.size['width']*0.5), y=int(wu.location['y'] + wu.size['height']*0.25)).perform()
# 划动操作
TouchAction(driver).press(x=758, y=341).move_to(x=229, y=335).release().perform()
# 多点触控
action0 = TouchAction().tap(x=758, y=341)
action1 = TouchAction().tap(x=229, y=335)
MultiTouch().add(action0).add(action1).perform()
8. Toast 控件定位:它系统级别的控件,APP 发送内容和指定时间给系统,由系统弹框,这类的控件不在 APP 内,需要特殊的控件识别方法。
用xpath定位 待更新
其它:部分摘录其它作者appium 安卓 和 IOS 环境搭建
报错 1:
ValueError: Timeout value connect was <object object at 0x0000019A00694540>, but it must be an int, float or None.
其实是selenium版本和urllib3版本不兼容问题。更换urllib3版本:
pip uninstall urllib3
pip install urllib3==1.26.2
也可以更换selenium版本,参考以下文章:
https://blog.csdn.net/qq_48302722/article/details/130861992
报错2:
......adb -P 5037 -s 27f7a675 shell pm clear com.android.calculator2 ....
在开发者选项中开启“禁止权限监控”,“OEM解锁”、“USB调试”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南