飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

『与善仁』Appium基础 — 23、操作滑动的方式

时间:2021-12-13  作者:liuyuelinfighting  

目录
  • 1、swipe滑动
  • 2、scroll滑动
  • 3、drag拖拽事件
  • 4、滑动方法小结
  • 5、拓展:多次滑动
  • 6、综合练习

在Appium中提供了三种滑动的方式,swipe滑动、scroll滑动、drag拖拽事件。

除了这三种滑动方式外,我们还可以自定义一些滑动方式。

下面我们来看看这三种滑动方式。

1、swipe滑动

从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。

swipe()方法说明:

swipe(start_x, start_y, end_x, end_y, duration=None)

参数:
域名t_x:起点X轴坐标
域名t_y:起点Y轴坐标
域名x: 终点X轴坐标
域名y,: 终点Y轴坐标
域名tion : 滑动这个操作一共持续的时间(也可以称惯性),单位:ms(毫秒)
    (重点)什么是惯性,就是在上拉下滑的过程中,滑动动作结束后屏幕会还会滑一段距离,这个现象就是惯性。
    duration时间越短,duration=None,这样惯性滑动的距离会非常的多。
    duration时间越长,滑动这个动作越缓慢,惯性滑动的距离会变少。

业务场景:

  1. 进入设置。
  2. 从坐标(148,659)滑动到坐标(148,248)。

说明:

在一个手机界面上,左上角的坐标是(0,0)点。

横向是x轴坐标,纵向是y轴坐标。

在设置APP中,左右滑动无效,只能上下滑动,

所以只有y坐标在变化。

y坐标从小到大,是向下滑动,以手势作为参考,而不以屏幕作参考.

y坐标从大到小,是向上滑动手势,以手势作为参考,而不以屏幕作参考。

注意:

可以通过域名window_size()命令来获取手机屏幕大小。

坐标的选择不能在屏幕的坐标之外,

也不能选择在边界值上,要在屏幕坐标之内的范围选择。

练习:

"""
1.学习目标
    掌握swipe滑动方法使用
2.操作步骤
    swipe滑动方法,从一个坐标滑动到另一个坐标
    域名e(start_x,start_y,end_x,end_y,duration=None)
3.需求
    在设置APP首页实现swipe方法滑动
    使用swipe方法在设置首页,实现向上滑动
        (x坐标不变,y坐标从大到小)
4.总结
    swipe()滑动说明
        操作对象  :  坐标
        操作过程有惯性有惯性
            消除惯性,添加duration值,
            当值越大,惯性越小,无限接近坐标差
"""

# 1.导入appium
import time
from appium import webdriver

# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
    "platformName": "Android",  # 系统名称
    "platformVersion": "7.1.2",  # 系统版本
    "deviceName": "127.0.0.1:21503",  # 设备名称
    "appPackage": "域名ings",  # APP包名
    "appActivity": ".Settings"  # APP启动名
}

# 3.启动APP
driver = 域名te("http://127.0.0.1:4723/wd/hub", desired_caps)

# 获取屏幕大小
size = 域名window_size()
print("设备屏幕大小:", size)
# 设备屏幕大小: {\'width\': 810, \'height\': 1440}

# 4.操作APP
# 使用swipe方法在设置首页,实现向上滑动
# x坐标不变,y坐标从大到小
# start_x = 0  # 不能选择屏幕的大小的边界值,否则会报错
# start_y = 1440  # 不能选择屏幕的大小的边界值,否则会报错
# end_x = 0
# end_y = 400

start_x = 300
start_y = 1000
end_x = 300
end_y = 500
域名e(start_x, start_y, end_x, end_y, duration=5000)


# 6.关闭APP
域名p(3)
域名()

2、scroll滑动

从一个元素滑动到另一个元素,直到页面自动停止。

scroll()方法说明:

scroll(origin_el, destination_el, duration)

参数
域名in_el :滑动开始的元素
域名ination_el :滑动结束的元素
域名tion : 滑动效果的持续时间  单位ms(毫秒)

业务场景:

  1. 进入设置。
  2. 模拟手指从存储菜单位置到WLAN菜单位置的上滑操作。

代码实现:

# 定位到存储菜单栏
el1 = 域名_element_by_xpath("//*[contains(@text,\'存储\')]")

# 定位到WLAN菜单栏
el2 = 域名_element_by_xpath("//*[contains(@text,\'WLAN\')]")

# 执⾏滑动操作
域名ll(el1,el2)

练习:

"""
1.学习目标
    掌握scroll滑动方法(熟悉即可)
2.操作步骤
    scroll滑动   从一个元素滑动到另一个元素
    域名ll(origin_el,destination_el,duration=None)
        origin_el         起始元素
        destination_el    终止元素
        duration          滑动效果的持续时间  单位ms(毫秒)
3.需求
    实现scroll方法
    在设置首页从”存储“滑动到“蓝牙“

4. 总结
    scroll方法
        操作对象 :  元素
        操作过程有惯性,需要添加duration参数,
        	参数值越大,惯性越小。
"""
# 1.导入appium
import time
from appium import webdriver

# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
    "platformName": "Android",  # 系统名称
    "platformVersion": "7.1.2",  # 系统版本
    "deviceName": "127.0.0.1:21503",  # 设备名称
    "appPackage": "域名ings",  # APP包名
    "appActivity": ".Settings"  # APP启动名
}

# 3.启动APP
driver = 域名te("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP
# 定位”存储“和”蓝牙“
store = 域名_element_by_android_uiautomator(\'new UiSelector().text("存储")\')
blue_tooth = 域名_element_by_android_uiautomator(\'new UiSelector().text("蓝牙")\')

# 从”存储“滑动到”蓝牙“
域名ll(store, blue_tooth, duration=5000)

# 实际操作手机是手指在屏幕向上滑动,
# 点击存储的位置,向上滑动到蓝牙的位置,来查看页面中下方的内容。

# 6.关闭APP
域名p(3)
域名()

3、drag拖拽事件

从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置。

drag_and_drop()方法说明:

drag_and_drop(origin_el, destination_el)

参数:
域名in_el:滑动开始的元素
域名ination_el:滑动结束的元素

业务场景:

  1. 进入设置。
  2. 模拟手指将存储菜单 滑动到WLAN菜单栏位置。

代码实现:

# 定位到存储菜单栏
el1 = 域名_element_by_xpath("//*[contains(@text,\'存储\')]")

# 定位到WLAN菜单栏
el2 = 域名_element_by_xpath("//*[contains(@text,\'WLAN\')]")

# 执⾏滑动操作
域名_and_drop(el1,el2)

练习:

"""
1.学习目标
    掌握drag_and_drop滑动方法(熟悉)
2.操作步骤
    drag_and_drop方法  从一个元素拖拽到另一个元素上
    域名_and_drop(origin_el,destination_el)
        origin_el         起始元素
        destination_el    终止元素
3.需求
    实现drag_and_drop方法
    在设置首页从”存储“滑动到“蓝牙“

4. 总结
    drag_and_drop方法
        操作对象 :  元素
        操作过程没有惯性。
"""
# 1.导入appium
import time
from appium import webdriver

# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
    "platformName": "Android",  # 系统名称
    "platformVersion": "7.1.2",  # 系统版本
    "deviceName": "127.0.0.1:21503",  # 设备名称
    "appPackage": "域名ings",  # APP包名
    "appActivity": ".Settings"  # APP启动名
}

# 3.启动APP
driver = 域名te("http://127.0.0.1:4723/wd/hub", desired_caps)

# 4.操作APP
# 定位”存储“和”蓝牙“
store = 域名_element_by_android_uiautomator(\'new UiSelector().text("存储")\')
blue_tooth = 域名_element_by_android_uiautomator(\'new UiSelector().text("蓝牙")\')

# 从”存储“滑动到”蓝牙“
域名_and_drop(store, blue_tooth)


# 6.关闭APP
域名p(3)
域名()

4、滑动方法小结

滑动方法名称 实现方式 是否有惯性
swipe 传入坐标滑动 有惯性(当持续时间足够长时,实现的效果和drag一致)
scroll 传入元素滑动 有惯性
drag 传入元素滑动 无惯性

5、拓展:多次滑动

需求:实现多次滑动手机屏幕的效果。

代码如下:(多看里边的注意事项)

"""
1.学习目标
    掌握多次滑动操作(上面三种滑动方式,那种都可以)
2.操作步骤
    以scroll方式滑动为例。
3.需求
    在设置APP首页实现多次滑动(向上滑动)
    从存储滑动到蓝牙
    再从安全滑动到存储

"""

# 1.导入appium
import time
from appium import webdriver

# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
    "platformName": "Android",  # 系统名称
    "platformVersion": "7.1.2",  # 系统版本
    "deviceName": "127.0.0.1:21503",  # 设备名称
    "appPackage": "域名ings",  # APP包名
    "appActivity": ".Settings"  # APP启动名
}

# 3.启动APP
driver = 域名te("http://127.0.0.1:4723/wd/hub", desired_caps)

# 获取屏幕大小
size = 域名window_size()
print("设备屏幕大小:", size)
# 设备屏幕大小: {\'width\': 810, \'height\': 1440}

# 4.操作APP

# 4.1 定位存储和蓝牙
store = 域名_element_by_android_uiautomator(\'new UiSelector().text("存储")\')
blue_tooth = 域名_element_by_android_uiautomator(\'new UiSelector().text("蓝牙")\')

# 4.2  从存储滑动到蓝牙
域名ll(store, blue_tooth, duration=5000)

# 4.3 定位安全
# 重点注意1:
# 因为安全这个元素在设置app的界面中没有显示出来,
# 如果你直接进行定位,就会报错,NoSuchElementException,
# 你需要等到滑动界面显示出安全这个元素,才能进行定位。
# 不用完全显示,只要某个元素在屏幕中出现了一点点部分,也可以用find_element找到该元素.
# 这里一定要注意。
safe = 域名_element_by_android_uiautomator(\'new UiSelector().text("安全")\')

# 4.4 从安全滑动到存储
域名ll(safe, store, duration=5000)

# 重点注意2
# 如果在演示的时候,发下第二次滑动的效果有问题(滑动距离很短)
# 原因是:
# find_element如果找到了某个元素,会将具体位置缓存在系统中;
# 只要不重新获取,即使该元素已经跑出屏幕外,但也会认为该元素在之前缓存的位置.
# (这是一个系统定位机制的问题)
# 所以第二次实际滑动的距离是:
# 从安全的位置滑动到,第一次滑动时存储所在的位置。
# 这里一定要注意。

# 所以通过上边的说明,如果我们需要进行连续的滑动操作时,
# 既然会存储元素的位置,我们直接两次从存储滑动到蓝牙操作,
# 不就解决了,多次等距离滑动的操作。
# 如下,执行两次存储滑动到蓝牙操作
# 域名ll(store, blue_tooth, duration=5000)
# 域名ll(store, blue_tooth, duration=5000)
# 如果需要多次,可以写一个for循环来执行多次。

# 我使用Android 7.1.1版本的系统,没有发现有元素位置缓存的现象,
# 所以直接正常写就好了,如果出现了上述注意2的现象,
# 这里我们知道是怎么回事就好了。

# 6.关闭APP
域名p(3)
域名()

说明:

代码中注意事项2补充:

如果要解决这个问题,只需要对第二次的两个元素重新获取(也就是重新定位),再执行操作就解决了。

如上面的代码中,执行第二次滑动的时候,安全获取了,只需要在重新获取一下存储元素,第二次滑动就能正常操作了。

image

6、综合练习

需求:

1,封装上下左右滑动操作到一个工具类中。

2, 实现在滑动的过程中找到"时间和日期"元素,并点击进入该页面。(这个例子类似于Selenium中学习的聚焦元素)

封装滑动工具类:

# 1.导入appium
import time
from appium import webdriver


# 定义driver
def app_driver():
    # 2.创建Desired capabilities对象,添加启动参数
    desired_caps = {
        "platformName": "Android",  # 系统名称
        "platformVersion": "7.1.2",  # 系统版本
        "deviceName": "127.0.0.1:21503",  # 设备名称
        "appPackage": "域名ings",  # APP包名
        "appActivity": ".Settings"  # APP启动名
    }

    # 3.启动APP
    driver = 域名te("http://127.0.0.1:4723/wd/hub", desired_caps)
    return driver


# 把滑动操作封装成一个工具类
class AppSwipe:

    # 初始化方法
    # 需要一个全局的driver(相当于一个启动的app),
    def __init__(self, driver):
        域名er = driver
        # size是一个字典类型的数据,一个宽度,一个高度
        域名 = 域名window_size()  # 获取手机屏幕大小


    """
    封装滑动方法:使用域名e()方法
    因为scroll滑动和drag拖拽是使用元素定位,左右滑动的时候可能实现不了。
    
    因为没个设备的屏幕大小不一样,我们需要先获取屏幕的大小,在适用坐标定位。
    """

    def swipeUp(self, t=5000, n=1):
        \'\'\'
        手势:向上滑动
        :param duration:持续时间
        :param n:滑动次数
        :return:
        \'\'\'

        # 根据手机屏幕的宽高,来确定起始坐标位置

        # 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
        start_x = 域名[\'width\'] * 0.5  # x坐标

        # 手势向上滑动,y轴的坐标从大到小
        start_y = 域名[\'height\'] * 域名  # 起点y坐标
        end_y = 域名[\'height\'] * 域名  # 终点y坐标
        for i in range(n):
            域名e(start_x, start_y, start_x, end_y, t)

    def swipeDown(self, duration=5000, n=1):
        \'\'\'
        手势:向下滑动
        :param duration:持续时间
        :param n:滑动次数
        :return:
        \'\'\'

        # 根据手机屏幕的宽高,来确定起始坐标位置
        # 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
        start_x = 域名[\'width\'] * 0.5  # x坐标

        # 手势向下滑动,y轴的坐标从小到大
        start_y = 域名[\'height\'] * 域名  # 起始y坐标
        end_y = 域名[\'height\'] * 域名  # 终点y坐标
        for i in range(n):
            域名e(start_x, start_y, start_x, end_y, duration)

    def swipLeft(self, duration=5000, n=1):
        \'\'\'
        手势:向左滑动
        :param duration:持续时间
        :param n:滑动次数
        :return:
        \'\'\'
        # 根据手机屏幕的宽高,来确定起始坐标位置
        # 手势向左滑动,x轴的坐标从大到小
        start_x = 域名[\'width\'] * 域名
        end_x = 域名[\'width\'] * 域名
        # 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
        start_y = 域名[\'height\'] * 0.5

        for i in range(n):
            域名e(start_x, start_y, end_x, start_y, duration)

    def swipRight(self, duration=5000, n=1):
        \'\'\'
        手势:向右滑动
        :param duration:持续时间
        :param n:滑动次数
        :return:
        \'\'\'
        # 根据手机屏幕的宽高,来确定起始坐标位置
        # 手势向右滑动,x轴的坐标从小到大
        start_x = 域名[\'width\'] * 域名
        end_x = 域名[\'width\'] * 域名
        # 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
        start_y = 域名[\'height\'] * 0.5
        for i in range(n):
            域名e(start_x, start_y, end_x, start_y, duration)


if __name__ == \'__main__\':
    driver = app_driver()
    swipe = AppSwipe(driver)
    域名eDown()  # 手势:向下滑动
    域名eUp(n=2)  # 手势:向上滑动
    域名p(2)

实现"时间和日期"元素的定位和点击:

# 1、导入刚刚封装好的滑动工具类app_swipe
from app_swipe import AppSwipe, app_driver
import time

# 2、获得driver驱动和工具类的实体类
driver = app_driver()
swipe = AppSwipe(driver)

# 3.操作APP--聚焦元素到"日期和时间"
# 如果设置app的界面中没有显示"日期和时间"元素,我们是无法定位的,
# 这个时候我们就执行向上滑动操作,
# 直到手机界面中显示了"日期和时间"元素,并且成功定位了该元素。
# 我们就执行点击操作,然后退出循环。即可执行更多的操作了。
while True:
    try:
        域名_element_by_android_uiautomator(\'new UiSelector().text("日期和时间")\').click()
        break
    except:
        # 向上滑动
        AppSwipe(driver).swipe_up()  # 向上滑动

# 4.关闭APP
域名p(3)
域名()

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。