说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!

接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/101050916

目录

四丶第三阶段appium基础API讲解

2.手机控件查看工具uiautomatorviewer

3.APP元素定位操作API

4.APP元素信息操作API

5.APP元素事件操作API

6.APP模拟手势高级操作

7.手机操作API


四丶第三阶段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常用元素定位方式

namevalue
idid属性值
classclass属性值
xpathxpath表达式

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.小结

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐