移动端自动化测试实战(二)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/101050916目录四丶第三阶段appium基础API讲解2.手机控件查看工具uiautomatorviewer3.APP元素定位操作API4.APP元素信息操作API5.A...
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/101050916
目录
四丶第三阶段appium基础API讲解
2.手机控件查看工具uiautomatorviewer
1.简介
用来扫描和分析Android应用程序的UI控件的工具.
2.如何使用
1.进入SDK目录下的tools目录,打开uiautomatorviewer
2.电脑连接真机或打开android模拟器
3.启动待测试app
4.点击uiautomatorviewer的左上角Device Screenshot,会生成app当前页面的UI控件截图
- 在Android sdk安装目录下的tools目录中打开uiautomatorviewer.bat批处理文件
- 打开后如下,点击如下截屏按钮
- 需要注意的是如果我们想扫描和分析Android手机中的设置程序,需要在安卓手机上打开此应用,再点击以上按钮,最终捕获到手机端的屏幕
5.选择截图上需要查看的控件,即可浏览该控件的id,class,text,坐标等信息
3.APP元素定位操作API
说明:手工测试主要通过可见按钮操作,而自动化是通过元素进行交互操作,⚠⚠⚠ 元素的基本定位基于当前屏幕范围内展示的可见元素;就跟我们web自动化测试中使用selenium的webdriver大体一样
1.Appium常用元素定位方式
name | value |
---|---|
id | id属性值 |
class | class属性值 |
xpath | xpath表达式 |
2.前置代码
3.通过id定位
- 通过Uiautomatorviewer工具查看设置程序搜索按钮的元素
- 脚本中进行如下编写,实现点击设置中的搜索按钮
- 运行脚本,成功的打开设置程序,并点击搜索
4.通过class定位
- 同理在工具中截图搜索界面,获取返回按钮元素的class属性值(需要注意的是有些元素class属性值是相同的,那么就不能使用)
- 脚本中进行如下编写
- 执行脚本,成功实现打开设置功能点击搜索按钮,在搜索界面点击返回操作
5.通过xpath定位
- 首先需要通过工具去获取设置功能中的显示按钮的元素信息
- 根据以上的text属性的值,通过xpath来匹配text属性的值
- 运行脚本,成功打开显示
6.通过id方式定位一组元素
- 通过工具可以得知设置程序中所有的字段按钮的元素id属性值都是一样的,都是com.android.settings:id/title
- 如果想要定位WLAN元素,则需要使用列表索引来获取,因为elements返回的结果是列表,在脚本中先打印获取到的所有元素列表,遍历该列表,打印每个元素的文本值
- 通过遍历获取的元素文本数据为更多时则进行点击操作并结束遍历
7.通过class方式定位一组元素
- 原理跟上面id方式一样就不多说了,首先是通过工具观察得知设置页面上的按钮文本元素的class属性值都是一样的
- 编写脚本,直接遍历打印所有元素文本数据
8.通过xpath方式定位一组元素
- 通过xpath匹配获取class属性的值,来获取设置页面元素文本信息,说白了该xpath方法的核心还是根据class属性来匹配的
9.WebDriverWait 显示等待操作
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
参数:
1.driver:手机驱动对象
2.timeout:搜索超时时间
3.poll_frequency:每次搜索间隔时间,默认时间为0.5s
4.method:定位方法(匿名函数)
匿名函数: lambda x: x
等价于python函数:
def test(x):
return x
使用示例:
WebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value))
解释:
1.x传入值为:driver,所以才可以使用定位方法.
函数运行过程:
1.实例化WebDriverWait类,传入driver对象,之后driver对象被赋值给WebDriverWait的一个类变量:self._driver
2.until为WebDriverWait类的方法,until传入method方法(即匿名函数),之后method方法会被传入self._driver
3.搜索到元素后until返回定位对象,没有搜索到函数until返回超时异常错误.
- 在脚本中实例化WebDriverWait 类需要从selenium库中去导入,然后调用这个类中的until方法,这个方法需接收一个匿名函数,从源码中可以看出,如下
- 在脚本中打印开始执行until方法之前的时间和执行完毕后的时间,查看是否超时,即搜索一个不存在的id属性值
- 运行脚本,查看打印结果,刚好5秒的时间,超过5秒没有找到则结束,打印出的Message: 为try中打印的错误信息,因为找不到id元素超时报错
- 定位存在的搜索按钮元素属性值并点击,两次打印时间一致,说明成功定位到元素id属性值
10.业务场景
实现:进入设置——点击更多——移动网络——关闭移动数据网络漫游
- 进入设置就不用说了,前置代码会自动打开设置应用的
- 通过工具查看更多按钮的元素属性(该按钮的id以及class属性值不是唯一,最简单方法则是使用xpath来匹配text,非要使用id或者class属性来查找,那么就需要使用elements获取列表来遍历判断了)
- 通过工具查看移动网络按钮的元素属性(该按钮的id以及class属性值不是唯一,最简单方法则是使用xpath来匹配text,非要使用id或者class属性来查找,那么就需要使用elements获取列表来遍历判断了)
- 通过工具查看关闭移动数据网络漫游按钮的元素属性
- 脚本中编写如下代码
- 运行脚本,实现场景成功
4.APP元素信息操作API
1.点击元素
- 通过工具获取设置页面搜索按钮的元素
- 在脚本中实现点击搜索
2.发送数据到输入框
- 定位搜索框元素
- 脚本中进行如下实现
- 运行脚本,成功实现点击搜索框并输入指定数据
- 当发送的内容为中文或者含有中文时,不会发送内容到输入框,解决方法则是在启动参数增加两个参数配置,如下所示
- 运行脚本,成功发送含有中文内容到输入框中
3.清空输入框内容
- 这个很简单,调用元素定位对象的clear方法即可
4.获取元素的文本内容
- 业务场景:对输入分别输入qu,vp,cdtaogang,没输入完一次后,需判断是否有搜索结果,如果有则打印该搜索结果下拉列表中的元素的text文本数据(需要注意的是如果有多个下拉搜索结果数据,则需要使用elements进行遍历获取打印,博主以上三个搜索内容的值仅一个或者没有,所以不用使用elements)
- 编写如下代码,需要注意的是当没有定位到id属性时,会捕获异常,所以需要在异常中打印搜索的内容
- 运行脚本,成功实现场景
5.获取元素的属性值
方法: get_attribute(value) # value:元素的属性
⚠value='name' 返回content-desc / text属性值
⚠value='text' 返回text的属性值
⚠value='className' 返回 class属性值,只有 API=>18 才能支持
⚠value='resourceId' 返回 resource-id属性值,只有 API=>18 才能支持
- 举例根据get_attribute方法获取搜索按钮name元素属性值,该搜索按钮text元素没有属性值,但是存在content-desc元素属性值
- 编写如下脚本,执行脚本,成功获取元素name的属性值
- 打印搜索按钮class元素属性值
- 打印搜索按钮resource-id元素属性值
6.获取元素在屏幕上的坐标
- 获取搜索按钮所在屏幕的坐标
7.获取app包名和启动名
获取包名方法:current_package
获取启动名:current_activity
- 获取设置程序的包名和启动名
8.添加联系人项目
业务场景:打开通讯录——点击新增联系人——选择本地保存——输入姓名——输入电话号码——点击返回按钮(即保存)
- 首先需要在手机上打开通讯录,然后通过adb命令获取通讯录程序的包名和启动名
- 前置脚本如下
- 然后通过工具,定位新增联系人按钮元素的id属性值(需保证该id值为页面唯一)
- 获取本地保存按钮元素信息
- 获取姓名输入框元素信息,在页面中所有输入框除了text不一致其余属性值都一致,所以博主这里使用elements方法遍历判断进行输入姓名电话号码
- 获取返回按钮元素信息,很不幸class属性值也不是唯一的,同理需要进行遍历判断点击操作
- 在脚本中的实现如下
- 运行脚本,成功实现场景
5.APP元素事件操作API
1.前置代码
2.swip滑动事件
⚠从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
方法:swipe(start_x, start_y, end_x, end_y, duration=None)
参数:
1.start_x:起点X轴坐标
2.start_y:起点Y轴坐标
3.end_x: 终点X轴坐标
4.end_y,: 终点Y轴坐标
5.duration: 滑动这个操作一共持续的时间长度,单位:ms
- 在工具中通过手机截屏,查看x轴y轴变化
- 如从设置页面中的wlan开始滑动到电池,首先需要通过工具获取到这两个元素的坐标
- 在脚本中进行如下编写,需要注意的是开始坐标为要滑动到的元素的坐标,而结束坐标为开始元素的坐标,运行脚本成功滑动到电池
- 设置滑动时间,模拟人为操作,单位为ms毫秒,这里设置3秒即可
3.scroll滑动事件
⚠从一个元素滑动到另一个元素,直到页面自动停止
方法:scroll(origin_el, destination_el)
参数:
1.origin_el:滑动开始的元素
2.destination_el:滑动结束的元素
- 从wlan开始滑动到存储,因为scroll方法是从一个元素滑动到另一个元素,所以需要定位开始以及存储的元素,这个就补多少了,只能使用xpath来匹配text,id与class属性均一致,编写代码如下
- 运行脚本,博主尝试几次测试都是将账户滑动到wlan位置,而并不是存储,只能说哈哈哈
4.drag拖拽事件
⚠从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
方法:drag_and_drop(origin_el, destination_el)
参数:
1.origin_el:滑动开始的元素
2.destination_el:滑动结束的元素
- 还是在脚本中从存储到wlan,那么存储元素就到到wlan元素的位置(大概)
5.应用置于后台事件
APP放置后台,模拟热启动
方法:background_app(seconds)
参数:
1.seconds:停留在后台的时间,单位:秒
- 运行脚本,效果如下
6.APP模拟手势高级操作
该章节内容放到下一篇博客演示
7.手机操作API
1.前置代码
2.获取手机时间
3.获取手机的宽高
- 然后通过获取到的屏幕宽高,来进行设置页面的滑动操作
4.发送键到设备
模拟系统键值的操作,比如操作honme键,音量键,返回键等。
方法:keyevent(keycode, metastate=None):
参数:
keycode:发送给设备的关键代码
metastate:关于被发送的关键代码的元信息,一般为默认值
- 常用键展示
- 在脚本中发送三次较小音量键
5.操作手机通知栏
- 为了更好的操作通知栏,博主在手机上安装了今日头条极速版,那么此时博主的手机上出现了今日头条的通知
- 通过工具,定位今日头条唯一元素
- 在脚本中需要实现打开通知栏,点击进入今日头条,最后点击home键
6.获取手机当前网络
- 打印出来的结果为6
- 对照set_network_connection方法中的判定表,可以得知6为所有网络开启
7.设置手机网络
- 根据以上的set_network_connection方法来设置手机网络
8.手机截图
9.滑动屏幕
- 要求是在手机主页面滑动到往左滑动另一页面
- 脚本实现如下
- 运行脚本,成功滑动到另一屏幕
10.小结
更多推荐
所有评论(0)