一、ADB
ADB全名Android Debug Bridge,是一个调试工具
adb构成:
1、Client端:运行在开发机器中,即你的开发电脑,用来发送adb命令
2、Daemon守护进程:运行在调试设备中,手机或模拟器,用来接收并执行abd命令
3、server端:同样运行在开发机器中,用来管理Client端和手机的Daemon的通信
1.1 获取包名和界面名
使用步骤:
1、打开需要测试的应用程序
2、输入adb命令
以下命令成功:
adb shell “dumpsys window | grep mCurrentFocus”
1.2 文件传输
1、发送文件
2、从手机拉取文件
1.3 获取app启动时间
1.4 获取手机日志
1.5 其他命令
二、Appium自动化测试
2.1 前置代码
adb获取安卓版本:
adb shell getprop ro.build.version.release
import time
# 导包模块
from appium import webdriver
desired_caps = dict()
# 平台名字
desired_caps['platformName'] = 'Android'
# 安卓版本
desired_caps['platformVersion'] = '9'
# 设备名字
desired_caps['deviceName'] = 'Appium'
# 包名,要打开的应用程序
desired_caps['appPackage'] = 'com.android.settings'
# 要打开的界面
desired_caps['appActivity'] = 'com.android.settings.MainSettings'
# 链接appium服务器
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 实例化driver
2.2 在脚本内启动其他app
"""
方法名和参数
参数:
appPackage:要打开的程序的包名
appActivity:要打开的程序界面名
driver.start_activity(appPackage,appActivity)
"""
2.3 获取app的包名和界面名
"""
获取包名:driver.current_package
获取界面名:driver.current_activity
"""
2.4 关闭app和驱动对象
"""
关闭当前操作的app,不会关闭驱动对象:
driver.close_app()
关闭驱动对象,同时关闭所有关联的app
driver.quit()
"""
2.5 安装和卸载
"""
安装app:
app_path:apk路径
driver.install_app(app_path)
卸载app:
app_id:应用程序包名
driver.remove_app(app_id)
判断app是否已经安装:
app_id:应用程序包名;返回值:布尔类型,true为安装,false为没有安装
driver.is_app_installed(app_id)
"""
2.6 置于后台
"""
app放置到后台一定时间再回到前台,模拟热启动
seconds:后台停留多少秒
driver.background_app(seconds)
"""
三、UIAutomatorViewer
应用场景:
定位元素的时候必须根据元素的相关特征来进行定位,而UIAutomatorViewer就是用来获取元素特征的
3.1 定位一个元素
"""
通过id定位一个元素
id_value:元素的resource-id属性值
driver.find_element_by_id(id_value)
通过class_name定位一个元素
class_value:元素的class属性值
driver.find_element_by_class_name(class_value)
通过xpath定位一个元素
xpath_value:定位元素的xpath表达式
driver.find_element_by_xpath(xpath_value)
"""
3.2 定位一组元素
"""
通过id定位一组元素
id_value:元素的resource-id属性值
driver.find_elements_by_id(id_value)
通过class_name定位一组元素
class_value:元素的class属性值
driver.find_elements_by_class_name(class_value)
通过xpath定位一组元素
xpath_value:定位元素的xpath表达式
driver.find_elements_by_xpath(xpath_value)
"""
四、元素等待
4.1 隐式等待
应用场景:
针对所有定位元素的超时时间设置为同一个值的时候
步骤:
在获取driver对象后,使用driver调用implicitly_wait方法
"""
driver.implicitly_wait(timeout)
"""
4.2 显式等待
应用场景:
针对所有定位元素的超时时间设置为不同的值的时候
步骤:
1、导包
2、创建WebDriverWait对象
3、调用WebDriverWait对象的until方法
wait = WebDriverWait(driver, 25, 5)
back_button = wait.until(lambda x: x.find_element_by_xpath("//*[@content-desc='收起']"))
back_button.click()
五、元素操作API
5.1 点击元素
element.click()
5.2 输入和清空输入框内容
# value:输入的内容
element.send_keys(value)
element.clear()
注意点:
默认输入中文无效,但不会报错,需要在“前置代码”中增加两个参数
desired_caps[‘unicodeKeyboard’] = True
desired_caps[‘resetKeyboard’] = True
5.3 获取元素的文本内容
# 返回值:控件的文本内容
element.text
5.4 获取元素的位置和大小
# 获取element的位置
# 返回值:字典,x为元素的x坐标,y为元素的y坐标
element.location
# 获取element的大小
# 返回值:字典,width为宽度,height为高度
element.size
5.5 获取元素的属性值
# 参数:value:要获取的属性名
# 返回值:根据属性名得到的属性值
element.get_attribute(value)
六、滑动和拖拽事件
6.1 swipe滑动事件
"""
从一个点滑动到另一个点
参数:
start_x: 起点x轴坐标
start_y: 起点y轴坐标
end_x: 终点x轴坐标
end_y: 终点y轴坐标
duration:滑动这个操作一共持续的时间长度,单位:ms
driver.swipe(start_x, start_y, end_y, duration=None)
"""
6.2 scroll滑动事件
"""
从一个元素滑动到另一个元素,直到页面自动停止
参数:
origin_el: 滑动开始的元素
destination_el: 滑动结束的元素
driver.scroll(origin_el, destination_el)
"""
6.3 drag_and_drop拖拽事件
"""
从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
参数:
origin_el: 滑动开始的元素
destination_el: 滑动结束的元素
driver.drag_and_drop(origin_el, destination_el)
"""
七、高级手势TouchAction
使用步骤:
1、创建TouchAction对象
2、通过对象调用想执行的手势
3、通过perform()执行动作
7.1 手指轻敲
应用场景:
模拟手指对某个元素或坐标按下并快速抬起,比如,固定点击(100,100)的位置
"""
参数:
element:元素
x:x坐标
y:y坐标
count:单击、双击之类
TouchAction(driver).tap(element=None,x=None,y=None,count=1).perform()
"""
7.2 按下和抬起
应用场景:
模拟手指一直按下,模拟手指抬起,可以用来组合成轻敲或长按的操作
"""
按下:
参数:
el:元素
x:x坐标
y:y坐标
count:单击、双击之类
TouchAction(driver).press(el=None,x=None,y=None).perform()
抬起:TouchAction(driver).press(el=None,x=None,y=None).release().perform()
"""
7.3 等待操作
应用场景:
模拟手指等待,比如按下后等待5秒之后再抬起
"""
参数:
ms:暂停的毫秒数
TouchAction(driver).wait(ms=0).perform()
"""
7.4 长按操作
应用场景:
模拟手指对元素或坐标的长按操作,比如,长按某个按钮弹出菜单
"""
参数:
el:元素
x:x坐标
y:y坐标
duration:长按时间,毫秒
TouchAction(driver).long_press(el=None,x=None,y=None,duration=1000).perform()
"""
7.5 移动操作
模拟手指移动操作,比如,手势解锁需要先按下,再移动
"""
参数:
el:元素
x:x坐标
y:y坐标
TouchAction(driver).move_to(el=None,x=None,y=None).perform()
"""
八、手机操作API
8.1 获取手机分辨率
应用场景:
自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标
"""
driver.get_window_size()
"""
8.2 手机截图
应用场景:
有些自动化的操作可能没有反应,但并不报错,此时我们就可以将操作过后的关键情况,截图留存,后期可以根据图片发现问题
"""
driver.get_screenshot_as_file(filename)
"""
8.3 获取和设置手机网络
应用场景:
视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员我们需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,不用流量的时候应该没有提示
"""
获取手机网络
driver.network_connection
设置当前网络
connectionType:网络类型
driver.set_network_connection(connectionType)
"""
8.4 发送键到设备
应用场景:
模拟按“返回键”“home键”等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能需要我们做自动化,一定会需要这个方法
"""
参数:
keycode:发送给设备的关键代码
metastate:关于被发送的关键代码的元信息,一般为默认值
driver.press_keycode(keycode,metastate=None)
"""
8.5 操作手机通知栏
应用场景:
测试即使通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏
"""
driver.open_notifications()
"""
注意点:
appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者按返回键