1. APP测试所需环境的搭建
三大环境:java、androidSDK和android模拟器
android模拟器:模拟手机,便于可视化
androidSDK:提供开发测试所需要的Android API类库
Java:Android底层是c、c++,应用层语音是Java,所以需要安装java环境
2. adb概念
adb全名android debug bridge,是一个调试工具
3. adb构成和工作原理
adb由三部分构成:Client端、Daemon守护进程、Server端
Client端:运行在开发机器中,即电脑端,用来发送adb命令
Daemon守护进程:运行在调试设备中,手机或者模拟器,用来接受并执行adb命令
Server端:运行在开发及其中,用来管理Client端和手机Daemon之间的通信
工作原理:
1.client端将命令发送给server端
2.server端会将命令发送给daemon端
3.daemon端执行命令
4.将执行结果返回给server端
5.server端将结果再返回给clien端
4. adb连接模拟器
执行测试之前,需要在本机与模拟器之间建立连接
adb connect IP地址:端口号
5. 包名和界面名的概念
包名(package):决定程序的唯一性(不是应用的名称)
界面名(activity):也称启动名,程序当前界面
6. 获取包名与界面名
mac/linux:
adb shell dumpsys window windows | grep mFocusedApp
windows:
adb shell dumpsys window windows | findstr mFocusedApp
'''
如果发现出错则修改为:
adb shell dumpsys window windows | findstr "mFocusedApp"
'''
7. 文件传输——发送文件到手机
将手机需要的数据在电脑上调整好,直接发送给手机
adb push 电脑的文件路径 手机的文件夹路径
8. 文件传输——从手机中拉取文件
将手机产生的文件(数据库文件,日志文件)拉取到电脑
adb pull 手机的文件路径 电脑的文件夹路径
9. 获取app启动时间
adb shell am start -W 包名/启动名
返回参数说明:
ThisTime:该界面(activity)启动耗时(毫秒)
TotalTime:应用自身启动耗时=ThisTime+应用application等资源启动时间(毫秒)
waitTime:系统启动应用耗时=TotalTime+系统资源启动时间(毫秒)
10. 获取手机日志
使用步骤:1.打开需要测试的应用程序 2.找到触发BUG的位置 3.使用查看日志命令 4.触发BUG 5.获取日志信息
adb logcat
11. adb其他命令
adb install 路径/xxx.apk:安装app到手机
adb uninstall 包名:卸载手机上的app,需要指定包名
adb devices:获取当前电脑已经连接设备获得对应的设备号
adb shell:进入安卓手机内部的linux系统命令行中
adb start-server:启动adb服务端,出bug时使用可以重启服务器,先关再启动
adb kill-server:停止adb服务端,出bug时使用可以重启服务器,先关闭再启动
adb --help:查看adb帮助,命令记不清楚时使用
12. 使用Appium连接模拟器
from appium import webdriver
desired_caps = {
'platformName':'Android',
'platformVersion':'9',
'deviceName':'deviceName',
'appPackage':'com.shark.jizhang',
'appActivity':'com.shark.jizhang.module.main.MainActivity',
'unicodeKeyboard':True,
'resetKeyboard':True,
'noReset':True,
'newCommandTimeout':6000,
'automationName':'UiAutomator2'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(10)
参数说明:platfromName:需要连接手机的平台(不限制大小写)
platformVersion:需要连接手机的版本号(可以只写主版本号,如7.2写为7)
deviceName:需要连接手机的设备号(安卓平台下可以随便写,但不能为空)
appPackage:需要启动的应用程序的包名
appActivity:需要启动的程序的界面名
13. 在脚本内启动其他app
如果一个应用需要跳转到另一个应用,就需要使用这个api进行应用跳转
driver.start_activity(appPackage,appActivity)
从鲨鱼记账跳转到设置应用
from appium import webdriver
import time
desired_caps = {
'platformName':'Android',
'platformVersion':'9',
'deviceName':'deviceName',
'appPackage':'com.shark.jizhang',
'appActivity':'com.shark.jizhang.module.main.MainActivity',
'unicodeKeyboard':True,
'resetKeyboard':True,
'noReset':True,
'newCommandTimeout':6000,
'automationName':'UiAutomator2'
}
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(10)
time.sleep(3)
driver.start_activity('com.android.settings','.Settings')
14. 获取app的包名和界面名
包名:通过driver对象调用current_package属性
界面名:通过driver对象调用current_activity属性
15. 关闭app和驱动对象
driver.close_app():关闭当前操作的app,不会关闭驱动对象
driver.quit():关闭当前的app,同时关闭驱动对象
16. 安装、卸载以及查看是否安装app
安装:driver.install_app(路径),路径指本地电脑app的安装包的路径地址
卸载:driver.remove_app(包名)
查看是否安装:driver.is_app_installed(包名)
17. 将应用置于后台
driver.background_app(seconds):seconds表示在后台停留多少秒
18. UIAutomatorVirwer的使用及注意事项
文件路径:android-sdk/tools/uiautomatorviewer.bat
想要查看具体信息点击左上角第二个按钮
注意点:1.命令行窗口不能关闭 2.如果闪退,则将jdk换成1.8版本 3.点击第二个按钮出错的时候,可以重启adb,adb kill-server;adb start-server,还出要将adb与模拟器重新连接
如果发现以下错误,则是由于android版本高于8导致,需要更换该文件,或者建议直接使用Appium。
19. Appium连接模拟器UI界面
点击右上角放大镜
依次将python文件中的desired_caps的键值对填入对应位置
20. 移动端元素的获取
三种方式:id、class name和xpath,但由于Appium直接提供xpath路径,因此大多数都是使用xpath来定位的
21. 滑动和拖动事件
swipe滑动事件:从一个位置滑动到另一个位置
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
参数说明:start_x:起点x轴坐标
start_y:起点y轴坐标
end_x:终点x轴坐标
end_y:终点y轴坐标
duration:滑动这个操作一共持续的时间长度,单位:ms
scroll/drag_and_drop滑动事件:从一个元素滑动到另一个元素
start_element = driver.find_element_by_xpath()
end_element = driver.find_element_by_xpath()
driver.scroll(start_element,end_element)
driver.drag_and_drop(start_element,end_element)
参数说明:start_element:启示元素位置
end_element:结束元素位置
scroll和drag_and_drop两者区别:scroll有惯性,drag_and_drop没有
22. TouchAction之轻敲
关键方法:tap(element,x,y,count=1)
from appium.webdriver.common.touch_action import TouchAction
element = driver.find_element_by_xpath('')
TouchAction().tap(element).perform()
注:element和xy只能输入一个,并且输入xy时,需要tap(x=,y=)不能省略;想要多次点击时,可以对count参数进行设置
23. TouchAction之按下和抬起
#按下
TouchAction(driver).press(element/x,y).perform()
#抬起
TouchAction(driver).release().perform()
24. TouchAction之等待
TouchAction(driver).wait(ms=0).perform()
25. TouchAction之长按
TouchAction(driver).long_press(element/x,y,duration).release().perform()
26. TouchAction之移动
TouchAction(driver).move_to(element/x,y).perform()
27. 手机分辨率及截图
#获取分辨率
driver.get_window_size() #返回字典,通过键值对取值
#截图
driver.get_screenshot_as_file(path) #path指的是文件存放路径及文件名
28. 获取和设置手机网络
#获取手机网络类型
driver.network_connection
#设置手机网络类型
driver.set_network_connection(connectionType)
'''
connnectionType可以从下图中0,1,2,4,6中选取数字
也可以从库中加载
from appium.webdriver.connectiontype import ConnectionType
'''
29. 发送键到设备
driver.press_keycode(keycode,metastat=None)
参数说明:keycode代表发送设备的关键代码,可以百度关键词android keycode查到
metastat:一般为默认值
30. 操作通知栏
#打开通知栏
driver.open_notifications()
'''
由于没有提供关闭通知栏指令,我们可以使用返回键关闭
driver.press_keycode(4)
'''