说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/101102587
目录
四丶第三阶段appium基础API讲解
6.APP模拟手势高级操作
TouchAction是AppiumDriver的辅助类,主要针对手势操作,比如滑动、长按、拖动等,
原理是将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行。
1.前置代码
2.手指轻敲操作
模拟手指轻敲一下屏幕操作
方法:tap(element=None, x=None, y=None)
方法:perform() # 发送命令到服务器执行操作
参数:
1.element:被定位到的元素
2.x:相对于元素左上角的坐标,通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
- 通过元素定位方式敲击屏幕(TouchAction这个类不知道怎么导入的话,直接Alt+Enter即可)
- 运行脚本,如下所示
- 通过坐标定位方式敲击屏幕
- 运行脚本,成功敲击wlan
3.手指按操作
模拟手指按下屏幕,按就要对应着离开
方法:press(el=None, x=None, y=None)
方法:release() # 结束动作,手指离开屏幕
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
- 通过元素定位方式按下屏幕,press按住元素,release松开手指,perform发送到服务器
- 通过坐标方式按下屏幕
4.等待操作
方法:wait(ms=0)
参数:
ms:暂停的毫秒数
业务场景:
1.进入设置
2.点击WLAN选项
3.长按WiredSSID选项5秒
- 第一种通过元素定位方式长按元素,代码如下
- 运行脚本,成功实现场景
- 第二种通过坐标方式模拟长按元素,添加等待(有长按)/不添加等待(无长按效果),代码如下
- 运行脚本,成功实现场景
5.手指长按操作
模拟手机按下屏幕一段时间,按就要对应着离开.跟以上wait方法效果一样,都能达到长按元素的效果,wait是按住元素等待时间,long_press则是一直按住元素,效果都一样
方法:long_press(el=None, x=None, y=None, duration=1000)
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标
4.duration:持续时间,默认为1000ms
业务场景:
1.进入设置
2.点击WLAN选项
3.长按WiredSSID选项5秒
- 第一种:通过元素定位方式长按元素,运行脚本成功实现场景
- 第二种:通过坐标定位方式长按元素,运行脚本成功实现场景
6.场景示例
说明:当通过脚本打开手机端中的文件管理器时会弹出一个对话框,我们需要点击确定按钮(该确定按钮可通过盲写xpath尝试搞定),然后点击内部存储设备
- 首先在手机端打开文件管理器,然后通过adb命令获取设备包名以及启动名
- 然后在脚本中打开文件管理器,出现欢迎弹框
- 通过盲写尝试获取确定元素,并点击,运行脚本,成功点击确定到如下页面
- 点击进入内部存储
- 紧接着长按Alarms文件2秒,通过测试发现通过xpath匹配text值无法定位到Alarms,所以博主通过获取所有的元素并判断每个元素的text属性的值,进行Alarms长按两秒操作
- 最后通过xpath定位属性元素并点击
- 整体效果如下:
7.手指移动操作
模拟手机的滑动操作
方法:move_to(el=None, x=None, y=None)
参数:
1.el:定位的元素
2.x:相对于前一个元素的X轴偏移量
3.y:相对于前一个元素的Y轴偏移量
业务场景1:
1.进入设置
2.向上滑动屏幕到可见"安全"选项
- 1.进入设置
- 2.向上滑动屏幕到可见"安全"选项
- 运行代码,成功实现场景(需要说明的一点则是,通过获取元素的坐标来进行滑动更精准,当然还可以使用上一篇博客中的drag_and_drop方法)
业务场景2:
1.进入设置
2.向上滑动屏幕到可见"安全"选项
3.进入到安全
4.点击屏幕锁定方式
5.点击图案
6.绘制图案
- 3~5步都是通过xpath匹配text属性值,进行点击
- 检验3~5步是否成功进入图案界面,为了验证每一步都都成功定位到元素以及坐标,所以博主采用debug模式运行
- 最后一步绘制图案,则需要通过每个原点的坐标来进行绘制,绘制如下图案
- 首先先获取上图中7个连接点的坐标
- 脚本如下,从press按住元素到move_to滑动到元素wait等待1秒然后release松开手指到最后perform将一系列的动作放在一个链条中发送到服务器,首先先测试前面三个点的连接,脚本如下
- 运行脚本,成功的实现前面三个点相连
- 按以上方式完成Z字母绘图代码如下
- 运行脚本,成功完成绘图
- 查看appium日志
8.小结
7.疑难问题解决
1.第一个疑问:move_to参数值问题
- 在以上第7.手指移动操作中博主在使用move_to完成第一个场景时,传递的给move_to方法中的参数更多的坐标并没有减去电池的坐标,经过反复测试,减去后是有问题的,反而不减去能定位到安全选项
2.第二个错误: An unknown server-side error occurred while processing the command.
- 每次执行脚本到TouchAction(driver)行代码时老是会出现该提示,经过博主上网查询并且一一实验后,应该是appium-desktop桌面版客户端不稳定导致的,所以博主打算使用Appium命令行安装方式,首先需要安装node.js,安装成功后如下操作
- 安装cnpm
- 安装appium,cnpm install -g appium
- 启动appium服务
- 运行脚本,cmd窗口运行appium成功获取操作日志,不再提示An unknown server-side error occurred while processing the command.报错
3.最终反复尝试没有问题的代码如下:
8.场景测试
业务场景1:
1.打开短信程序
2.按住第一条短信
3.执行删除
4.点击进入第二条短信(当第一条短信被删除成功后,则第二条短信的坐标则是第一条短信的坐标)
5.按住内容
6.点击查看详情
7.打印详情数据
- 首先需要在手机端打开信息程序,通过adb命令获取包名和启动名
- 还需要通过工具定位元素
- 通过坐标定位方式获取第一条短信的坐标,通过press方法按住两秒,成功的显示出删除按钮
- 脚本实现如下:(博主在这里通过xpath的=来完全匹配查看详情,之前都是用contains包含)
- 在执行脚本,在点击进入第二条短信后,定位消息内容坐标出错了提示没有搜索到先关元素
- 查看截图确认是定位短信内容出错
- 那么博主现在修改代码,将坐标定位修改为元素id定位
- 再次运行脚本,成功的实现场景,有时候测试就是需要不断的测试才能有最终答案
业务场景2:
1.打开短信程序
2.点击进入第一条短信
3.按住内容
4.点击复制文字
5.粘贴到信息输入框
6.点击发送信息
- 脚本实现如下,需要注意的是粘贴时需用到组合键,并且不要搞错参数的位置
- 运行脚本,成功实现场景
五丶第四阶段pytest入门
1.Pytest安装和介绍
1.Pytest介绍
pytest是python的一种单元测试框架,同自带的Unittest测试框架类似,相比于Unittest框架使用起来更简洁,效率更高。
2.主要有以下特点
1.非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
2.支持简单的单元测试和复杂的功能测试
3.支持参数化
4.执行测试过程中可以将某些测试跳过,或者对某些预期失败的Case标记成失败
5.支持重复执行失败的Case
6.支持运行由Nose , Unittest编写的测试Case
7.具有很多第三方插件,并且可以自定义扩展
8.方便的和持续集成工具集成
3.Pytest安装(pytest官网)
1.源码安装
1.进入下载包路径
2.python setup install
3.安装出现权限问题:
3.1.mac/linux 添加sudo,运行:sudo python setup install
3.2.windows 管理员方式运行cmd窗口,运行:python setup install
2.命令安装
1.mac/linux:sudo pip3 install -U pytest # -U:可以理解为--upgrade,表示已安装就升级为最新版本
2.管理员方式运行cmd:pip3 install -U pytest
3.安装成功校验
1.进入命令行
2.运行:pytest --version # 会展示当前已安装版本
4.Pytest运行的第一个例子
- 在IDE中编写如下代码(说明:-s的作用则是显示出测试函数中的打印语句内容)
- 执行结果如下
5.Pytest运行方式
1.测试类主函数模式
pytest.main("-s test_abc.py")
- 例如:如上__name__中的运行
2.命令行模式
pytest 文件路径/测试文件名
pytest ./test_abc.py
- 例如:执行如下
2.Pytest的setup和teardown函数
1.概述
1.setup和teardown主要分为:模块级,类级,功能级,函数级。
2.存在于测试类内部
2.函数级别setup()/teardown()
运行于测试方法的始末,即:运行一次测试函数会运行一次setup和teardown
- 示例代码如下:
- 运行代码,查看测试结果,pytest和unittest是一样的
3.类级别
说明:运行于测试类的始末,即:在一个测试内只运行一次setup_class和teardown_class,不关心测试类内有多少个测试函数。
注意:在unittest中的类级别为setUpClass静态方法以及tearDownClass静态烦方法;在pytest中则是setup_class和teartown_class
- 示例代码如下:
- 运行代码,查看打印顺序,与unittest中的setUpClass及tearDownClass方法一样
4.场景示例
场景描述:
1.打开设置;2.点击更多;3.点击移动网络;4.点击首选网络类型;5.选择3G;6.判断是否选择3G成功
- 结合pytest,编写脚本如下
- 运行脚本,成功实现场景,assert断言成功,没有打印设置失败说明设置3G网络成功
- 有时候程序运行比较快时,页面没有反应过来,导致元素搜索不到,那么可以通过实例化WebDriverWait类实现当元素不存在时等待5秒再检查的一个操作,则不需要在代码前使用time.sleep了,具体实现如下
- 运行脚本,也是成功实现场景,没有任何问题
- 现在将代码中assert断言修改为2G,那么这样肯定是断言失败的,运行脚本,成功打印出设置失败,代码逻辑OK
3.Pytest配置文件
说明:pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令行运行时会使用该配置文件中的配置
1.配置pytest命令行运行参数
[pytest]
addopts = -s ... # 空格分隔,可添加多个命令行参数 -所有参数均为插件包的参数
2.配置测试搜索的路径
[pytest]
testpaths = ./scripts # 当前目录下的scripts文件夹 -可自定义
3.配置测试搜索的文件名
[pytest]
python_files = test_*.py
# 当前目录下的scripts文件夹下,以test_开头,以.py结尾的所有文件 -可自定义
4.配置测试搜索的测试类名
[pytest]
python_classes = Test_*
# 当前目录下的scripts文件夹下,以test_开头,以.py结尾的所有文件中,以Test_开头的类 -可自定义
5.配置测试搜索的测试函数名
[pytest]
python_functions = test_*
# 当前目录下的scripts文件夹下,以test_开头,以.py结尾的所有文件中,以Test_开头的类内,以test_开头的方法 -可自定义
- 在IDE中创建pytest.ini配置文件,并创建reports目录用于存放测试报告,然后再创建scripts目录,将测试脚本代码放进去,这样整个目录就比较清晰了,配置信息如下
- 说明一点:配置的命令行运行参数,在终端中的相当于执行如下命令
4.Pytest常用插件
说明:插件列表网址:https://plugincompat.herokuapp.com 包含很多插件包,大家可依据工作的需求选择使用。
1.Pytest测试报告
通过命令行方式,生成xml/html格式的测试报告,存储于用户指定路径。
插件名称:pytest-html
安装方式:
1.安装包方式 python setup.py install
2.命令行 pip3 install pytest-html
使用方法:
命令行格式:pytest --html=用户路径/report.html
- 首先通过命令安装pytest-html插件
- 示例代码如下:
运行方式:
1.修改Pytest_Api/pytest.ini文件,添加报告参数,即:addopts = -s --html=./report.html
# -s:输出程序运行信息
# --html=./report.html 在当前目录下生成report.html文件
⚠️若要生成xml文件,可将--html=./report.html 改成 --html=./report.xml
2.命令行进入Pytest_Api目录
3.执行命令: pytest
执行结果:
1.在当前目录会生成assets文件夹和report.html文件
- 在Terminal终端执行pytest命令后,提示如下错误
- 指向了我们的pytest.ini编码问题
- 解决方法则是设置文件编码为gbk编码即可
- 再次执行pytest命令成功的执行了scripts目录下的test_api_01.py文件中的test测试方法,为什么没有执行其他的脚本以及方法,在于我们配置的pytest.ini文件的配置
- 成功的在当前目录会生成assets文件夹和report.html文件
- 打开report.html文件
2.Pytest控制函数执行顺序
函数修饰符的方式标记被测试函数执行的顺序.
插件名称:pytest-ordering
安装方式:
1.安装包方式 python setup.py install
2.命令行 pip3 install pytest-ordering
使用方法:
1.标记于被测试函数,@pytest.mark.run(order=x)
2.根据order传入的参数来解决运行顺序
3.order值全为正数或全为负数时,运行顺序:值越小,优先级越高
4.正数和负数同时存在:正数优先级高
默认情况下,pytest是根据测试方法名由小到大执行的,可以通过第三方插件包改变其运行顺序
- 首先安装pytest-ordering插件
- 示例代码如下
- 运行脚本,查看执行顺序(默认顺序),先打印了test_a再打印test_b
- 通过装饰方式控制函数执行顺序
- 再次执行脚本,那么先打印了test_b再打印test_a,通过装饰器中order的值的大小来控制执行顺序
3.Pytest失败重试
通过命令行方式,控制失败函数的重试次数。
插件名称:pytest-rerunfailures
安装方式:
1.安装包方式 python setup.py install
2.命令行 pip3 install pytest-rerunfailures
使用方法:
命令行格式:pytest --reruns n # n:为重试的次数
- 安装pytest-rerunfailures插件
运行方式:
1.修改Test_App/pytest.ini文件,添加失败重试参数,即:addopts = -s --reruns 2 --html=./report.html
# -s:输出程序运行信息
# --reruns 2 :失败测试函数重试两次
# --html=./report.html 在当前目录下生成report.html文件
2.命令行进入Test_App目录
3.执行命令: pytest
- 首先在配置文件中添加失败重试参数
- 执行pytest运行scripts目录下的test_*.py的测试文件
- 打开reports目录下的report.html测试报告,查看报告可以看到两次重试记录
4.小结
5.场景测试
场景描述:结合前面的函数丶配置丶插件知识点在脚本实现两个测试用例(也就是两个测试方法)分别是检查更多选项下的VPN选项是否存在和移动网络选项下的首选网络类型是不是2g
- 代码如下,test_2G测试用例肯定是错误的,因为目前手机的首选网络类型为3G
- 然后在pytest.ini配置文件中修改测试搜索的文件名
- 执行脚本,与预期结果一致
- 查看生成的report.html测试报告(虽然测试结果与预期结果一致,但是其中有两条原因为超时)