简介
随着现在智能手机的普及和应用,小到五六岁或者更小的娃娃,老至七八十岁老头老太太都是智能手机的用户,基本上达到每个人都在用,每次在地铁或者公交上,就看看到这样的场面,手指不停地在手机屏幕上来来回回的的滑呀滑,滑呀滑!滑个不停,那么我们如何在自动化测试中用脚本来实现这些操作呢???在这里宏哥给小伙伴们介绍两种操作,一个是比较低级的滑动,另一个是比较高级的滑动。
低级溜冰的滑动
例如:在app应用日常使用过程中,会经常用到在屏幕滑动操作。如刷朋友圈上下滑操作、浏览图片左右滑动操作、特别是现在抖音上的上下滑动操作等。在自动化脚本该如何实现这些操作呢?
在Appium中模拟用户滑动操作需要使用swipe方法,让宏哥带着大家一起看一下该方法源码,该方法定义如下:
- start_x - 滑动开始x轴坐标
- start_y - 滑动开始y轴坐标
- end_x - 滑动结束x轴偏移量
- end_y - 滑动结束y轴偏移量
- duration - (可选) 执行此次滑动时间,单位毫秒.
其中end_x和 end_y 为基于start_x和start_y的偏移量。最终在执行中的 to_x = start_x+end_x 并非end_x
duration 参数单位为ms(默认5毫秒) 注意1s =1000ms
滑动解析
滑动主要分为:
- 水平滑动
- 垂直滑动
- 任意方向滑动
滑动轨迹图如下:
示例:
获取屏幕尺寸
左滑 - x 坐标由大到小,y 坐标不变
-
技巧:左滑是从较大x值 --->较小x值,所以 to_x=sx+(-ex)
-
技巧:左滑时y轴值基本无变化,所以ey=0
-
技巧:sx的值一定大于屏幕尺寸的53%,否则虽向左滑动但不能生效切换页面
def swipe_left(self): s = self.GetPageSize() sx = s[0] * 0.57 sy = s[1] * 0.75 ex = s[0] * 0.55 ey = 0 self.driver.swipe(sx, sy, -ex, ey, dt)
右滑 - x 坐标由小到大,y 坐标不变
-
技巧:sx的值一定不能大于屏幕尺寸的 46%,否则虽然向右滑动但不能生效切换页面
def swipe_right(self): s = self.GetPageSize() sx = s[0] * 0.43 sy = s[1] * 0.75 ex = s[0] * 0.54 ey = 0 self.driver.swipe(sx, sy, ex, ey, dt)
上滑 (俗称上拉加载更多)- x 坐标不变,y 坐标由大到小
-
技巧:上滑是从较大y值--->较小y值,所以to_y=sy+(-ey)
-
技巧:上滑时x轴值基本无变化,所以ex = 0
-
技巧:sx的值可s[0]范围内随意,sy和ey 需在 s[1]0.2 -- s[1]-s[1]0.4 之间取值,
因为需要考虑:状态条、导航栏、底部功能栏等所占数值
def swipe_up(self): s = self.GetPageSize() sx = s[0] * 0.43 sy = s[1] * 0.45 ex = 0 ey = s[1] * 0.55 self.driver.swipe(sx, sy, ex, -ey, dt)
下滑(俗称下拉刷新)- x 坐标不变,y 坐标由小到大
-
技巧:sx的值可s[0]范围内随意,sy和ey 需在 s[1]*0.2 -- s[1]-s[1]*0.4 之间取值,
因为需要考虑:状态条、导航栏、底部功能栏等所占数值
def swipe_down(self): s = self.GetPageSize() sx = s[0] * 0.35 sy = s[1] * 0.45 ex = 0 ey = s[1] * 0.55 self.driver.swipe(sx, sy, ex, ey, dt)
实践应用
“纸上得来终觉浅,绝知此事要躬行 ”,这句话的意思就是,从书本上看来的东西终究是非常的片面的,因为很多东西,不单单是看到的那个样,而且耳听也是虚的,没有亲自去见证这个东西的存在,他的真假,或者是否存在都是一个未知数,那第二句呢,就是这件事情只有你亲自做了,才能知道是真是假。才会有经验所得。很简单的一个例子,就是如果你出去找工作,都会让你填自己的工作经历,一方面看看你是不是这块料,其实这个也是一块敲门砖,你写了,他们才会看看你的能力能不能驾驭他们这份工作,很多人都是的,如果有的话,那你幸运了,你就是他们公司的重点培养对象,会格外的关注到你,这对找工作的我们也是一个非常好的,非常有利的一件事。好了那么就跟随宏哥来躬行一下吧。
测试场景
- 安装启动考研帮,手动向水平左滑动首页引导页面。
- 点击“立即体验”进入登录页面。
测试环境
1.宏哥的系统环境是Windows 10版本 64位系统
2.j宏哥的dk版本:"1.8.0_181"
3.宏哥的appium版本:1.4.16
4.selenium:3.141.0
安装selenium:
输入指令pip install selenium
验证安装成功:pip show selenium
5.测试设备:Android 5.1.1 (不能低于5.0版本)
6.Python:3.7.2
命令:python -V ,回车即可。
7.测试App:考研帮Android app V3.1.0
想法与思路
- 安装启动考研帮
- 由于目前版本低,会有升级提示,代码实现点击“取消”
- 代码实现向左滑动首页引导页面
- 点击“立即体验”进入登录页面
代码实现
(1)安装启动考研帮
(2)升级提示,点击“取消”(这里宏哥将其封装为一个方法,后边调用即可!)
(3)向左滑动到首尔引导页面,用到我们一开始介绍的swipe方法
(4)点击“立即体验”,进入登录页面
运行结果
运行过程
参考代码
capability.py
1 # coding=utf-8 2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 3 4 # 2.注释:包括记录创建时间,创建人,项目名称。 5 ''' 6 Created on 2019-8-05 7 @author: 北京-宏哥 QQ交流群:707699217 8 Project:学习和使用appium自动化测试-滑动 9 ''' 10 # 3.导入模块 11 from appium import webdriver 12 from selenium.common.exceptions import NoSuchElementException 13 14 desired_caps={} 15 desired_caps['platformName']='Android' 16 desired_caps['deviceName']='127.0.0.1:62025' 17 desired_caps['platforVersion']='5.1.1' 18 desired_caps['automationName']='uiautomator2' 19 20 desired_caps['app']=r'C:\Users\DELL\Downloads\kaoyanbang.apk' 21 desired_caps['appPackage']='com.tal.kaoyan' 22 desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity' 23 24 desired_caps['noReset']='False' 25 desired_caps['unicodeKeyboard']="True" 26 desired_caps['resetKeyboard']="True" 27 28 driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps) 29 driver.implicitly_wait(2) 30 31 #定义的点击“取消”按钮方法 32 def check_cancelBtn(): 33 print('check cancelBtn') 34 35 try: 36 cancelBtn = driver.find_element_by_id('android:id/button2') 37 except NoSuchElementException: 38 print('no cancelBtn') 39 else: 40 cancelBtn.click() 41 42 #定义的点击“跳过”按钮方法 43 def check_skipBtn(): 44 print('check skipBtn') 45 46 try: 47 skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip') 48 except NoSuchElementException: 49 print('no skipBtn') 50 else: 51 skipBtn.click() 52 53 #调用点击“取消”按钮方法 54 check_cancelBtn() 55 56 #调用点击“跳过”按钮方法 57 # check_skipBtn()
swipe.py
1 # coding=utf-8 2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行 3 4 # 2.注释:包括记录创建时间,创建人,项目名称。 5 ''' 6 Created on 2019-8-05 7 @author: 北京-宏哥 QQ交流群:707699217 8 Project:学习和使用appium自动化测试-滑动 9 ''' 10 # 3.导入模块 11 from capability import driver 12 from time import sleep 13 from selenium.common.exceptions import NoSuchElementException 14 15 #定义获取手机屏幕大小方法 16 def get_size(): 17 x=driver.get_window_size()['width'] 18 y=driver.get_window_size()['height'] 19 return x,y 20 21 #调用获取手机屏幕大小 22 l=get_size() 23 print(l) 24 25 #定义向左滑动方法 26 def swipeLeft(): 27 l=get_size() 28 x1=int(l[0]*0.9) 29 y1=int(l[1]*0.5) 30 x2=int(l[0]*0.1) 31 driver.swipe(x1,y1,x2,y1,1000) 32 #定义向上滑动方法 33 def swipeUp(): 34 l = get_size() 35 x1 = int(l[0] * 0.5) 36 y1 = int(l[1] * 0.95) 37 y2 = int(l[1] * 0.35) 38 driver.swipe(x1, y1, x1, y2, 1000) 39 #定义向下滑动方法 40 def swipeDown(): 41 l=get_size() 42 x1 = int(l[0] * 0.5) 43 y1 = int(l[1] * 0.35) 44 y2 = int(l[1] * 0.85) 45 driver.swipe(x1, y1, x1, y2, 1000) 46 #定义向右滑动方法 47 def swipeRight(): 48 l=get_size() 49 y1 = int(l[1] * 0.5) 50 x1 = int(l[0] * 0.25) 51 x2 = int(l[0] * 0.95) 52 driver.swipe(x1, y1, x2, y1, 1000) 53 54 for i in range(2): 55 #调用向左滑动方法 56 swipeLeft() 57 sleep(0.5) 58 59 #定义的点击“立即体验”按钮方法 60 def click_experBtn(): 61 print('click experBtn') 62 63 try: 64 experBtn = driver.find_element_by_id('com.tal.kaoyan:id/activity_splash_guidfinish') 65 except NoSuchElementException: 66 print('no skipBtn') 67 else: 68 experBtn.click() 69 70 #调用点击“立即体验”按钮 71 click_experBtn()
小结
appium的滑动实现和溜冰一样它们是门艺术,实现不好就会出现事与愿违的操作,就拿溜冰来说,做的不好就容易受伤;而appium呢,比如本来想要向上滑动,却出现了下拉的动作,这样使得我们在调试中就要花费大量时间去调试滑动操作。
以下是宏哥在滑动操作中总结的一点经验,希望可以对遇到这方面问题的童鞋们或者是小伙伴们有一点帮助;
总结:
1、滑动时中间要巧妙的加等待时间,不加等待时间容易出错,而且加等待时间的长短也要掌握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间比较稳,每个程序可能会有所差异,还要注意的是ios和Android的等待时间也会有差异,ios等待1000毫秒可能出现长安的效果;
2、滑动的坐标点,滑动的坐标点要掌握好,如果坐标点掌握不好也会导致错误出现,比如Android和ios就有很大区别。
3、代码
#定义向左滑动方法 def swipeLeft(): l=get_size() x1=int(l[0]*0.9) y1=int(l[1]*0.5) x2=int(l[0]*0.1) driver.swipe(x1,y1,x2,y1,1000)
问题:
1、这里面的,[0]、[1]是根据什么来定夺的?
2、0.9、0.5、0.1这三个值又是怎么取的?
3、[0] * 0.1的意思表示?
解释:
将l[0]和l[1]的值打印出来,如图
因为滑动两次,所以循环2次,由上图可知:l[0]=720,l[1]=1280;从值宏哥理解:l[0]就是整个X轴,l[1]就是整个Y轴。
坐标轴一般以左上角为起始点(x=0,y=0) ;getSize()函数是返回屏幕大小,这里可以理解为右下角、即最大的(x,y)的坐标。
向左滑: 高度、即y轴不变, 宽度、即x轴由右边(大)->滑向左边(小)
综合来说, y1=getSize()[1]*0.5=可以理解为Y轴娶了一半,即y轴的最中央, x1=getSize()[0]*0.9=可以理解为X轴娶了多一半,即x轴靠右, x2=getSize()[0]*0.1=可以理解为X轴娶了一点,即x轴靠左
我们来看一下。打印结果看看宏哥是不是胡诌的了,答案和宏哥说的大致一样,聪明的你懂了没?实际也不用打印,直接用X轴、Y轴自己一算就知道了。
打印结果
您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得点波 推荐 哦!!!(点击右边的小球即可! :))
个人公众号 微信群 (微信群已满100,可以加宏哥的微信拉你进群) 宏哥微信(请备注:进群)