UI自动化APP
环境介绍
- 模拟器
- adb
- appium
- Appium-Python-Client
- 在python中的一个包, 作用是通过python代表编写自动化测试脚本
adb常用命令
adb devices
adb devices
* daemon not running; starting Now at tcp:5037
* daemon started successfully
List of devices attached
emulator-5554 offline
# 检测到了一个设备, offline离线(设备存在, 但并没有连接到adb),
# 解决办法, 再次运行adb devices
List of devices attached
emulator-5554 device
# 显示device,代表连接设备成功
获取app的包名和界面名
- 每个app都有一个包名
- 一个app中不同的界面都有自己的界面名
- 在移动端自动化测试中, 如果要测试一个app,那么就一定要知道这个app的包名和界面名
adb shell dumpsys window windows | findstr mFocusedApp
第一步: 在安卓中启动app
第二步: 在windows的cmd中执行如下命令:
adb shell dumpsys window windows | findstr mFocusedApp
mFocusedApp=AppWindowToken{5c9352d token=Token{c2ef044 ActivityRecord{aaedd57 u0 com.tpshop.malls/.SPMainActivity t5
- 包名com.tpshop.malls
- 界面名.SPMainActivity
安卓文件与windows的同步
adb pull
adb pull 安卓的文件路径文件名 windows的文件存放路径
adb pull /default.prop c:\file
# 把安卓根目录下的文件default.prop, 下载到windows的c盘file目录里
adb pull /lib/libz.so c:\file
# 把安卓根目录的lib目录下的文件libz.so, 下载到windows的c盘file目录里
adb push
adb push windows的文件路径 安卓的文件位置
adb push c:\file\a.txt /sdcard
# 把windos上的c盘file目录下的a.txt上传到安卓的根目录的sdcard里
adb启动指定的app
adb shell am start -W 包名/界面名
adb shell am start -W com.tpshop.malls/.SPMainActivity # 启动tpshop
Status: ok
Activity: com.tpshop.malls/.SPMainActivity
ThisTime: 3662 # 界面启动需要的时间
TotalTime: 3662 # 包启动需要的时间
WaitTime: 3786 # 安卓为启动app需要的时间
Complete # 完成
查看安卓系统日志
adb安装和卸载app
adb install c:\file\tn3180.apk # 安装c盘file目录里的tn3180.apk这个安装文件
adb uninstall com.tencent.news # 把包com.tencent.news卸载
重启adb服务
- adb kill-server 关闭服务
- adb start-server 启动服务
adb后台有个服务进程, 有时候这个进程会工作出问题, 通过以上两个命令, 可以重启adb的服务
查看adb帮助
基础操作
from appium import webdriver
import time
dict1 = {"platformName":"Android",
"platformVersion":"7.1",
"deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
"unicodeKeyboard":True, # 中文支持
"resetKeyboard":True, # 中文支持
"appPackage":"com.android.settings", # 启动的包名
"appActivity":".Settings" # 界面名
}
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.find_element_by_id("dashboard_tile").click()
time.sleep(5)
driver.quit()
启动指定包和界面
- driver.start_activity(包名, 界面名)
# 打开通讯录
driver.start_activity("com.android.contacts", ".activities.PeopleActivity")
获取包名和界面名
- driver.current_package # 包名
- driver.current_activity # 界面名
print(driver.current_package)
print(driver.current_activity)
关闭驱动和app
driver.close_app()
安装和卸载app
- 判断是否安装指定app
- driver.is_app_installed("包名")
- 安装app
- driver.install_app(r"apk文件路径")
- 卸载app
if driver.is_app_installed("com.tencent.news"):
driver.remove_app("com.tencent.news") # 如果已经安装腾讯新闻, 卸载
else:
driver.install_app(r"C:\app\TencentNews_3180.apk") # 如果没有安装腾讯新闻, 安装
- driver.background_app(秒数)
driver.background_app(3)
定位元素
定位单个元素
- id定位
- driver.find_element_by_id(resource-id属性值)
- class定位
- driver.find_element_by_class_name(class属性值)
- name定位
- driver.find_element_by_accessibility_id(content-desc属性)
- 当定位到多个符合条件的元素时,默认返回第一个
定位多个元素
# 1.点击系统设置中的WLAN
# 2.点击WLAN中的开关按钮
from appium import webdriver
import time
dict1 = {"platformName":"Android",
"platformVersion":"7.1",
"deviceName":"127.0.0.1:5555", # 随便填一个值, 但不能空
"unicodeKeyboard":True, # 中文支持
"resetKeyboard":True, # 中文支持
"appPackage":"com.android.settings",
"appActivity":".Settings"}
driver = webdriver.Remote("http://localhost:4723/wd/hub", dict1)
driver.find_element_by_id("dashboard_tile").click()
time.sleep(2)
driver.find_element_by_id("switch_widget").click() # 点击WLAN开关
# 如果有多个id为"dashboard_tile"的元素, 点击第二个
# driver.find_elements_by_id("dashboard_tile")[1].click()
time.sleep(5)
driver.quit()
总结