简介

  随着现在智能手机的普及和应用,小到五六岁或者更小的娃娃,老至七八十岁老头老太太都是智能手机的用户,基本上达到每个人都在用,每次在地铁或者公交上,就看看到这样的场面,手指不停地在手机屏幕上来来回回的的滑呀滑,滑呀滑!滑个不停,那么我们如何在自动化测试中用脚本来实现这些操作呢???在这里宏哥给小伙伴们介绍两种操作,一个是比较低级的滑动,另一个是比较高级的滑动。

低级溜冰的滑动

例如:在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

滑动解析

滑动主要分为:

  1. 水平滑动
  2. 垂直滑动
  3. 任意方向滑动

滑动轨迹图如下:

示例:

获取屏幕尺寸

左滑 - x 坐标由大到小,y 坐标不变
  • 技巧:左滑是从较大x值 --->较小x值,所以 to_x=sx+(-ex)

  • 技巧:左滑时y轴值基本无变化,所以ey=0

  • 技巧:sx的值一定大于屏幕尺寸的53%,否则虽向左滑动但不能生效切换页面

def swipe_left(self):
      s = self.GetPageSize()
      sx = s[] * 0.57
      sy = s[] * 0.75
      ex = s[] * 0.55
      ey =
      self.driver.swipe(sx, sy, -ex, ey, dt)

右滑 - x 坐标由小到大,y 坐标不变

  • 技巧:sx的值一定不能大于屏幕尺寸的 46%,否则虽然向右滑动但不能生效切换页面

 def swipe_right(self):
      s = self.GetPageSize()
      sx = s[] * 0.43
      sy = s[] * 0.75
      ex = s[] * 0.54
      ey =
      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.43
     sy = s[] * 0.45
     ex =
     ey = s[] * 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.35
      sy = s[] * 0.45
      ex =
      ey = s[] * 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

 # coding=utf-
 # .先设置编码,utf-8可支持中英文,如上,一般放在第一行

 # .注释:包括记录创建时间,创建人,项目名称。
 '''
 Created on --
 @author: 北京-宏哥   QQ交流群:
 Project:学习和使用appium自动化测试-滑动
 '''
 # .导入模块
 from  appium import webdriver
 from selenium.common.exceptions import NoSuchElementException

 desired_caps={}
 desired_caps['platformName']='Android'
 desired_caps['deviceName']='127.0.0.1:62025'
 desired_caps['platforVersion']='5.1.1'
 desired_caps['automationName']='uiautomator2'

 desired_caps['app']=r'C:\Users\DELL\Downloads\kaoyanbang.apk'
 desired_caps['appPackage']='com.tal.kaoyan'
 desired_caps['appActivity']='com.tal.kaoyan.ui.activity.SplashActivity'

 desired_caps['noReset']='False'
 desired_caps['unicodeKeyboard']="True"
 desired_caps['resetKeyboard']="True"

 driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
 driver.implicitly_wait()

 #定义的点击“取消”按钮方法
 def check_cancelBtn():
     print('check cancelBtn')

     try:
         cancelBtn = driver.find_element_by_id('android:id/button2')
     except NoSuchElementException:
         print('no cancelBtn')
     else:
         cancelBtn.click()

 #定义的点击“跳过”按钮方法
 def check_skipBtn():
     print('check skipBtn')

     try:
         skipBtn = driver.find_element_by_id('com.tal.kaoyan:id/tv_skip')
     except NoSuchElementException:
         print('no skipBtn')
     else:
         skipBtn.click()

 #调用点击“取消”按钮方法
 check_cancelBtn()

 #调用点击“跳过”按钮方法
 # check_skipBtn()

swipe.py

 # coding=utf-
 # .先设置编码,utf-8可支持中英文,如上,一般放在第一行

 # .注释:包括记录创建时间,创建人,项目名称。
 '''
 Created on --
 @author: 北京-宏哥   QQ交流群:
 Project:学习和使用appium自动化测试-滑动
 '''
 # .导入模块
 from capability import driver
 from time import sleep
 from selenium.common.exceptions import NoSuchElementException

 #定义获取手机屏幕大小方法
 def get_size():
     x=driver.get_window_size()['width']
     y=driver.get_window_size()['height']
     return x,y

 #调用获取手机屏幕大小
 l=get_size()
 print(l)

 #定义向左滑动方法
 def swipeLeft():
     l=get_size()
     x1=]*0.9)
     y1=]*0.5)
     x2=]*0.1)
     driver.swipe(x1,y1,x2,y1,)
 #定义向上滑动方法
 def swipeUp():
     l = get_size()
     x1 = ] * 0.5)
     y1 = ] * 0.95)
     y2 = ] * 0.35)
     driver.swipe(x1, y1, x1, y2, )
 #定义向下滑动方法
 def swipeDown():
     l=get_size()
     x1 = ] * 0.5)
     y1 = ] * 0.35)
     y2 = ] * 0.85)
     driver.swipe(x1, y1, x1, y2, )
 #定义向右滑动方法
 def swipeRight():
     l=get_size()
     y1 = ] * 0.5)
     x1 = ] * 0.25)
     x2 = ] * 0.95)
     driver.swipe(x1, y1, x2, y1, )

 ):
     #调用向左滑动方法
     swipeLeft()
     sleep(0.5)

 #定义的点击“立即体验”按钮方法
 def click_experBtn():
     print('click experBtn')

     try:
         experBtn = driver.find_element_by_id('com.tal.kaoyan:id/activity_splash_guidfinish')
     except NoSuchElementException:
         print('no skipBtn')
     else:
         experBtn.click()

 #调用点击“立即体验”按钮
 click_experBtn()

小结

appium的滑动实现和溜冰一样它们是门艺术,实现不好就会出现事与愿违的操作,就拿溜冰来说,做的不好就容易受伤;而appium呢,比如本来想要向上滑动,却出现了下拉的动作,这样使得我们在调试中就要花费大量时间去调试滑动操作。

以下是宏哥在滑动操作中总结的一点经验,希望可以对遇到这方面问题的童鞋们或者是小伙伴们有一点帮助;

总结:

1、滑动时中间要巧妙的加等待时间,不加等待时间容易出错,而且加等待时间的长短也要掌握好,一般在200-1000毫秒之间应该差不多,自己调试几次感觉一下哪个时间比较稳,每个程序可能会有所差异,还要注意的是ios和Android的等待时间也会有差异,ios等待1000毫秒可能出现长安的效果;

2、滑动的坐标点,滑动的坐标点要掌握好,如果坐标点掌握不好也会导致错误出现,比如Android和ios就有很大区别。

3、代码

#定义向左滑动方法
def swipeLeft():
    l=get_size()
    x1=]*0.9)
    y1=]*0.5)
    x2=]*0.1)
    driver.swipe(x1,y1,x2,y1,)

问题:

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,可以加宏哥的微信拉你进群)                                          宏哥微信(请备注:进群)          

                                                                                                                                  

Appium+python自动化(二十七)-让你在手机找到溜冰一样的感觉666,溜得飞起来 - 低级滑动(超详解)的更多相关文章

  1. Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)

    简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或 ...

  2. Appium+python自动化(三十四)- 有图有真相,很美很精彩 - 屏幕截图和Android APP类型简介(超详解)

    简介 在实际自动化项目运行过程中,很多时候App可以会出现各种异常,为了更好的定位问题,除了捕捉日志我们还需要对运行时的设备状态来进行截屏.从而达到一种“有图有真相”的效果. 截图方法 方法1 sav ...

  3. Appium+python自动化(十七)- 你难道猴哥失散多年的混血弟弟 - Monkey简介之开山篇(超详解)

    简介 今天由宏哥给小伙伴们来介绍猴哥的混血弟弟=Monkey.Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上. Monk ...

  4. Appium+python自动化20-查看iOS上app元素属性

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素 Mac版的appium1.6的 ...

  5. Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP

    前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itoo ...

  6. Appium+python自动化20-查看iOS上app元素属性【转载】

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...

  7. Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP【转载】

    前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itoo ...

  8. Appium+python自动化-查看app元素属性

    本文转自:https://www.cnblogs.com/yoyoketang/p/7581831.html 前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道 ...

  9. Appium+python自动化8-Appium Python API

    Appium+python自动化8-AppiumPython API   前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...

随机推荐

  1. 透过字节码分析java基本类型数组的内存分配方式。

    我们知道java中new方式创建的对象都是在堆中创建的,而局部变量对应的值存放在栈上.那么java中的int [] arr={1,2,3}是存放在什么地方的呢,int []arr = new int[ ...

  2. Spring Framework 组件注册 之 FactoryBean

    Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...

  3. F#周报2019年第27期

    新闻 介绍Femto--使用Fable绑定的自动化npm包解决方案 Babel 7.5.0发布,包含动态导入与F#管道 iOS 13预览版发布 视频及幻灯片 Fabulous--F#用于跨平台移动应用 ...

  4. decimal.ToString()问题

    decimal dt = 1.00M;            decimal dt1 = 1M;                         bool d = dt == dt1;         ...

  5. 设计模式-抽象工厂模式(AbstractFactory)

    抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit.SouthFruit)的产品对象. 角色和职责: ...

  6. yarn or npm 版本固化如何选择

    前言 作为前端开发者,npm这个包管理工具的重要性显而易见.优点不再表述,但一些缺点是为使用者诟病比较多的:速度慢.版本控制.下面主要讨论下npm的版本固化问题,即lock文件. npm语义化版本管理 ...

  7. Ural 2070:Interesting Numbers(思维)

    http://acm.timus.ru/problem.aspx?space=1&num=2070 题意:A认为如果某个数为质数的话,该数字是有趣的.B认为如果某个数它分解得到的因子数目是素数 ...

  8. 线性表的顺序存储C++代码实现

      关于线性表的概念,等相关描述请参看<大话数据结构>第三章的内容, 1 概念   线性表list:零个或多个数据的有限序列.   可以这么理解:糖葫芦都吃过吧,它就相当于一个线性表,每个 ...

  9. 01(b)无约束优化(准备知识)

    1.解方程转化为优化问题 $n\left\{ \begin{aligned}& {{P}_{1}}(x)=0 \\ & {{P}_{2}}(x)=0 \\ & \text{   ...

  10. php接口数据安全解决方案(二)

    前言 实例演示token签名并创建token 解析token并校验token合法性 类库封装管理jwt实例 前言 JWT是什么 JWT是json web token缩写.它将用户信息加密到token里 ...