| 万叶集 |
|---|
| 隐约雷鸣,阴霾天空。 |
| 但盼风雨来,能留你在此。 |
前言:
✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 哈士奇 ,一位致力于 TFS - 全栈 赋能的博主 ✌
CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
专栏系列(点击解锁) 学习路线指引 知识定位 Python全栈白皮书 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。 语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。 自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。 自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。 数据库开发实战篇 更新中 爬虫入门与实战 更新中 数据分析篇 更新中 前端入门+flask 全栈篇 更新中 django+vue全栈篇 更新中 拓展-人工智能入门 更新中 网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者 网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。 vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。 shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结] WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈 点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器 测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得! 测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。 RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。 Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。 MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。
文章目录
- 滑动操控
- 如何获取设备屏幕坐标系
- 模拟实现一个简单的滑动操作
- 将 "滑动操控" 改为公共的方法
其实在前面两个章节的元素定位的场景,我们已经对 app 中的自动化操作已经略知一二。这里我们发现, 实际上 appium 复用了 selenium 的很多很多的操作方式,所以像一些 “点击、输入” 等操作,这种常规的操作的方式与在 WEB 自动化中的方式基本上是完全一致的,就不再进行赘述了。
唯一一个与 WEB 端不太一样的地方就是关于 “滑动操控” ,所以 “页面的滑动” 在实际操作手机过程中,也是最常使用的,只需要操控一个点在屏幕中拖动到另外一个点就可以了。这个 “滑” 的过程就是一个滑动的动作。
在 “appium” 中,对于 “滑动” 的操作也做了一些简单的封装,为其提供了方法,这就是 “swipe” 。
滑动操控OK,接下来我们就看一些,滑动操控 的脚本究竟要怎么写。
在模拟 “滑动操控” 的时候,使用的方法就是 swipe() ,该方法的参数说明如下:
如何获取设备屏幕坐标系
- start_x:起始横坐标
- start_y:起始纵坐标
- end_x:结束时横坐标
- end_y:结束时纵坐标
- duration:滑动持续时间,单位毫秒,默认None(一般设置500-1000毫秒比较合适)
ps:如果不设置 "duration" ,即为 0秒 ,无法看到滑动效果。
duration 参数需要注意的是:在移动设备上滑动时间的快慢所形成的效果是不一样的。以今日头条APP首页上滑为例,同样的滑动距离,滑动较快则出现类似翻页的效果,而滑动较慢则是同一则新闻从起始位置滑动到结束位置。
手机屏幕的坐标:以手机屏幕最左上角的坐标点为坐标中心(0, 0),向右话滑动则纵坐标不变,横坐标变大;向下滑动则横坐标不变,纵坐标变大。
在实际工作场景中,不同测试机的屏幕尺寸存在着很大的差异性。所以正常情况下,我们不会选择使用固定的的坐标来滑动屏幕。
一般操作是,先获取测试机屏幕尺寸,再通过获取的手机屏幕尺寸来确定滑动的起始、结束坐标;这样,即使在我们更换了测试手机后也不需要重新更改坐标。使用webdriver提供的get_window_size()方法可以获取屏幕尺寸(即屏幕右下角的坐标),方法如下:
# 获取屏幕宽度 width = driver.get_window_size()['width'] # 获取屏幕高度 height = driver.get_window_size()['heigth']
滑动屏幕操作代码如下:()
# 屏幕从下向上滑动 driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000) sleep(1) # 屏幕从上向下滑动 driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000) sleep(1) # 屏幕从左向右滑动 driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000) sleep(1) # 屏幕从右向左滑动 driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, 1000) sleep(1) 模拟实现一个简单的滑动操作
代码示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是将安卓、IOS的底层封装成了 webdriver 类型的语句
from appium.webdriver.common.appiumby import By
# 启动参数
desired_caps = {} # 定义 desired_caps 变量,用以赋值很多的启动信息
desired_caps['platformName'] = 'Android' # 设备名称、系统为 "Android"
desired_caps['platformVersion'] = '7.1.2' # 这里是在夜神模拟器的设置中心查看安卓版本是 "7.1.2" ,后续会告诉大家如何切换版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 这里如果是真机的话填写的是设备名称;因为我们用的是模拟器,填写的是IP端口号
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;这里我们使用的是通讯录
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 启动的界面的名字(也或者叫启动名,默认是 "." 开头的)
# desired_caps['automationName']='UiAutomator1'
# 声明手机驱动
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注册到这个节点上,传入 "desired_caps"。这个节点就是 "appium" 开启的端口节点
sleep(1)
# 获取屏幕宽度
width = driver.get_window_size()['width']
# 获取屏幕高度
height = driver.get_window_size()['height']
# 利用 "swipe" 实现滑动, 屏幕从下向上滑动
driver.swipe(width*0.5, height*0.9, width*0.5, height*0.1, 1000)
sleep(1)
# 利用 "swipe" 实现滑动, 屏幕从上向下滑动
driver.swipe(width*0.5, height*0.1, width*0.5, height*0.9, 1000)
sleep(1)
# 利用 "swipe" 实现滑动, 屏幕从左向右滑动
driver.swipe(width*0.1, height*0.5, width*0.9, height*0.5, 1000)
sleep(1)
# 利用 "swipe" 实现滑动, 屏幕从右向左滑动
driver.swipe(width*0.9, height*0.5, width*0.1, height*0.5, 1000)
sleep(1)
driver.terminate_app('com.baidu.searchbox')
# driver.quit()
运行结果如下:
将 “滑动操控” 改为公共的方法
上文中的脚本虽然也能够实现我们针对 App 的 “滑动操控” 的操作,但是代码的整洁度上来看不是那么的美观。既然如此,我们是否能够将其封装起来,变成一个公共的方法,当然是可以的了,继续往下看。
代码示例如下:
# coding=utf-8
from time import sleep
from appium import webdriver # appium 的特色就是将安卓、IOS的底层封装成了 webdriver 类型的语句
def getSize(driver):
"""获取页面大小"""
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return(x, y)
def swipeRight(driver):
"""向右滑动 - [x轴变动,y轴不变]"""
l = getSize(driver)
x1 = int(l[0]*0.8)
x2 = int(l[0]*0.2)
y = int(l[1]*0.5)
driver.swipe(x1, y, x2, y, 1000)
def swipeLeft(driver):
"""向左滑动 - [x轴变动,y轴不变]"""
l = getSize(driver)
x1 = int(l[0]*0.9)
x2 = int(l[0]*0.1)
y = int(l[1]*0.5)
driver.swipe(x2, y, x1, y, 1000)
def swipeDown(driver):
"""向下滑动 - [x轴不变,y轴变动]"""
l = getSize(driver)
y1 = int(l[1]*0.9)
y2 = int(l[1]*0.1)
x = int(l[0]*0.5)
driver.swipe(x, y1, x, y2, 1000)
def swipeUp(driver):
"""向上滑动 - [x轴不变,y轴变动]"""
l = getSize(driver)
y1 = int(l[1]*0.8)
y2 = int(l[1]*0.2)
x = int(l[0]*0.5)
driver.swipe(x, y2, x, y1, 1000)
def swipeDemo():
# 启动参数
desired_caps = {} # 定义 desired_caps 变量,用以赋值很多的启动信息
desired_caps['platformName'] = 'Android' # 设备名称、系统为 "Android"
desired_caps['platformVersion'] = '7.1.2' # 这里是在夜神模拟器的设置中心查看安卓版本是 "7.1.2" ,后续会告诉大家如何切换版本
desired_caps['deviceName'] = '127.0.0.1:62001' # 这里如果是真机的话填写的是设备名称;因为我们用的是模拟器,填写的是IP端口号
# desired_caps['appPackage'] = 'com.baidu.searchbox' # APP 的包名;这里我们使用的是通讯录
# desired_caps['appActivity'] = 'com.baidu.searchbox.SplashActivity' # 启动的界面的名字(也或者叫启动名,默认是 "." 开头的)
# desired_caps['automationName']='UiAutomator1'
# 声明手机驱动
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 注册到这个节点上,传入 "desired_caps"。这个节点就是 "appium" 开启的端口节点
sleep(1)
# 利用 "swipe" 实现滑动, 屏幕从下向上滑动
swipeDown(driver)
sleep(2)
# 利用 "swipe" 实现滑动, 屏幕从上向下滑动
swipeUp(driver)
sleep(2)
# 利用 "swipe" 实现滑动, 屏幕从左向右滑动
swipeLeft(driver)
sleep(2)
# 利用 "swipe" 实现滑动, 屏幕从右向左滑动
swipeRight(driver)
sleep(2)
driver.terminate_app('com.baidu.searchbox')
# driver.quit()
if __name__ == '__main__':
swipeDemo()
运行结果如下:
其实滑动在实际操作中应用的场景还是不少的,就比如要定位的元素在页面下方必须要通过滑动才能往下滑将其展示出来;再比如解锁密码、或者滑动九宫格之类的场景… 类似的滑动场景,大家可以在真实的场景中逐步的去体验。
到此,一个很简单的基于 “百度App” 实现的 demo 就到此结束了。但是该 demo 仅仅是基于实现,没有像之前的 WEB 框架那样去同意做处理、去进行 PO 模式的编写。
所以接下来的下一章节,就是将我们现有的一个 “baiduTest” 的代码想之前的 WEB 框架那样融合起来,做成一个 PO 那样,从而更好的完成 App 的自动化。



