python+appium自动化测试-滑动到固定的位置停止

news2024/12/27 13:56:33

当前很多APP都存在滑动操作,但这些元素一般无法单独定位到,多为一个数组或列表,这边介绍了几种方法,使元素滑动到你想要的位置后停止。

一、scroll()方法

Appium 中webdriver提供scroll()方法来滚动页面,该方法只适用于屏幕上已经显示的两个元素,从一个元素滚动到另一个元素。若元素不存在当前屏幕或被遮挡,则无法使用该方法。

方法介绍:

scroll(self, start_el, stop_el, duration=None):

参数:
          - start_el- 开始要滚动的元素
          - stop_el- 要滚动到的元素
          - 即从元素stop_el滚动至元素start_el
          - duration 即滚动的持续时间

 上栗子:使用scroll()方法实现从“2008”滑动到“2012”,即方向为向上滑动,将2012滑动到2008的位置。
在这里插入图片描述
具体代码如下:

def scroll():	
	stop_el = self.driver.find_element_by_xpath("//android.widget.TextView[@text='2008']")
	start_el = self.driver.find_element_by_xpath("//android.widget.TextView[@text='2012']")
	self.driver.scroll(start_el, stop_el)

注意:以上方法无法实现从2008滑动到2013,因为2013未显示在屏幕中,被遮挡了。

二、UiScrollable()方法

UiScrollable是UiCollection的子类,专门处理滚动时间,提供各种滚动方法,下面只介绍了滚动到固定的对象。

相关概念:

  • 步长:从一点到另一点使用的时间。步长越短滚动越快,反之步长越长滚动越慢。
  • 扫动次数:触发滚动的次数。

上栗子:使用上一个方法scroll()的栗子图片,实现从“2008”滑动到“2012”。

def test():
	self.driver.find_element_by_android_uiautomator(
            'new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("2012")).scrollToEnd(10,5)')

# text("2012"):表示需要滑动的位置
# scrollToEnd(10,5):以步长(速率)5滚动到列表底部,最多滚动10次。

注意:该方法会直接滑动到列表最底部或最顶部,在中间时比较不好判断,如果列表的数据比较长的话,建议不使用哦。 评论区有没有哪位大神,有好的方法来解决这个局限性,感谢!!

三、swipe()方法

之前已经有发布swipe()方法的封装类,具体位置: juejin.cn/post/691558…

上栗子:仍然以方法一的图片作为例子,当前的年份为2008,需要滑动或点击2020。

使用循环实现,具体实现方法为:

  • 写一个循环,循环中再做判断
  • 若查找到元素,则执行点击
  • 若未查找到元素,则做上滑操作,向上滑动列表
  • 若向上滑到列表最底部仍然未查找到数据,则判断当前是否处于列表最底部
  • 当前处于列表最底部,则做下滑操作,向下滑动列表

 

def swipe():
            # 默认没找到元素
            is_find = False
            # 默认顺序查找,即上滑
            is_sequential_search = True
            while is_find is not True:
            try:
                self.driver.find_element_by_xpath("//android.widget.TextView[@text='1995']").click()
                is_find = True    # 找到了,退出循环
            except NoSuchElementException:
                if is_sequential_search:    # 顺序查找
                    # 该方法调用已封装的向上滑动类
                    self.slide.swipe_up(2500)
                    # 所有年份,获取屏幕列表中最底部的一个年份的text值
                    years = self.driver.find_elements_by_class_name("android.widget.TextView")
                    years_text = years[9].text
                    # 判断获取到的text值是否等于2021
                    if years_text == "2021":    # 到列表的最后一个,但没找到
                        is_sequential_search = False    # 转换为逆序查找,即下滑
                else:
                    # 该方法调用已封装的向下滑动类
                    self.slide.swipe_down_search(2500)

注意:scroll() 与swipe()的区别,swipe是可以根据自己需要设置滑动的距离,而scroll是根据页面中两个元素位置距离进行滑动。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matplotlib---中文显示问题、字体库、图像结构、画布设置

1. 中文显示问题 解决方案一: 下载中文字体(黑体,看准系统版本) 步骤一:下载 SimHei 字体(或者其他的支持中文显示的字体也行) 步骤二:安装字体 linux下:拷贝字体到 usr…

三层架构综合实验

目录 拓扑结构: 要求: 确定广播域的个数 分配网段 配置Eth-Trunk 创建VLAN 配置STP生成树协议 修改根 边缘端口 SVI VRRP DHCP 路由部分 OSPF 缺省 汇总 NAT 拓扑结构: 要求: 1、内部IP地址基于172.16.0.0/16进行…

CABAC编解码原理分析

CABAC编解码原理分析 文章目录 CABAC编解码原理分析一、二进制算数编码二、CABAC编码三、CABAC编解码与普通的二元算术编码的区别四、 CABAC编解码中各个变量的计算:五、 一些其他问题:六、 总结:七、参考资料 一、二进制算数编码 cabac是一…

Nginx网络服务的配置

目录 一、Nginx概述 二、Nginx相对于Apache的优点 三、配置Nginx网络服务 1.编译安装和启用Nginx服务 2.修改Nginx主配置文件 一、Nginx概述 Nginx是一款高性能、轻量级Web服务软件。稳定性高,系统资源消耗低,对HTTP并发连接的处理能力高&#xff…

DNS 监控工具

域名系统 (DNS) 解析(也称为 DNS 查找)是在现代 IT 基础架构中建立连接和通信所需的基本组件之一。这是将人类可读的域或主机名与机器可读的 IP 地址映射的过程,使用户更容易访问组织的公共和专用网络上的主机。在最基…

SpringBoot 三级缓存解决循环依赖源码分析

文章目录 1. 不使用三级缓存可能存在的问题2. 源码分析2.1 对象实例的创建过程2.2 三级缓存的处理 3. 遗留问题 1. 不使用三级缓存可能存在的问题 在 SpringBoot 框架中,如果只存在两级缓存,那么当发生循环依赖的时候可能存在异常的对象创建流程如下图所…

如何解析 Impala 的 C++ 报错堆栈

生产环境用的都是release build,C代码产生的报错堆栈里没有函数名,很难像Java报错堆栈那样方便定位问题。下面是一个常见的启动报错,一般在CLASSPATH设置有误时发生: I0619 19:13:00.951988 5279 status.cc:129] Failed to find…

【全新升级版】R语言实战(第3版),超过30万学习者入手的R语言教程

在我刚入学那会儿初次接触R语言,看的第一本工具书就是《R语言实战》,收获良多,当时还只是第二版。最近和人民邮电出版社的好朋友交流发现,他告诉我上个月刚刚出版了《R语言实战 第三版》 ,豆瓣评分9.2,被称…

Linux之生产者消费者模型(上)——单生产者单消费者

文章目录 前言一、生产者消费者模型1.生产消费2.生产消费关系321原则生产消费模型的特点 二、基于阻塞队列(blockqueue)的生产消费模型1.概念2.单生产单消费模型代码运行分析两种情况导致的现象生产者生产的慢,消费者消费的快生产者生产的快&…

精彩回顾 | “XR云新未来:弹性算力赋能可交互、沉浸式商业实践” 赋能云端虚拟世界

6月15日,由平行云联合首都在线共同主办,中关村软件园协办,以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 活动邀请多位XR行业大咖,共同见证首都在线联合平行云发布Cloud XR平台。…

MySQL数据库——索引

MySQL数据库——索引 一、索引基本常识1.索引的概念2.索引的作用3.创建索引的依据 二、索引的分类1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 三、索引的查看与删除1.查看索引2.删除索引 一、索引基本常识 数据库索引是数据库管理系统中一个排序的数据结构&#xff0…

OpenGL 深度测试

1.简介 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的&#xf…

6 从0开始学PyTorch | 构建模型、损失函数、广播机制

前面都在学一些PyTorch的基本操作,从这一节开始,真正进入到模型训练的环节了。原作者很贴心的一步步教我们实现训练步骤,并且还从一个最简单的例子出发,讲了优化方案。 宏观上的训练过程 image.png 当然这里所说的训练还没有到深…

vue进阶-vue-cli

CLI是Command-Line Interface,翻译为命令行界面,但是俗称脚手架。 Vue-CLI是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速搭建 Vue 开发环境以及对应的 webpack 配置。 vue项目相关文件以 .vue 为后缀,需要事先安装 N…

【LeetCode热题100】打卡第25天:柱状图中最大的矩形

文章目录 柱状图中最大的矩形⛅前言🔒题目🔑题解 柱状图中最大的矩形 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目&#xf…

GEE:绘制一个点的Landsat1985-2020年逐日NDVI时间序列折线图

作者:CSDN @ _养乐多_ 本文记录了在GoogleEarthEngine(GEE)平台上选择一个点,根据该点在时间段内所有有效像素值绘制折线图的代码。 结果如下图所示, 文章目录 一、代码二、代码链接一、代码 var roi = geometry Map.addLayer(roi, {color

6.15集合1 和 泛型

举例 1:中药店,每个抽屉外面贴着标签 举例 2:超市购物架上很多瓶子,每个瓶子装的是什么,有标签 举例 3:家庭厨房中 集合 我们接下来要学习的内容是Java基础中一个很重要的部分:集合 1 Coll…

【服务器数据恢复】AIX下raid故障导致pool无法加载的数据恢复案例

服务器数据恢复环境: IBM P740小型机AIX操作系统Sybase数据库V7000存储。V7000存储配置了12块SAS机械硬盘(其中一块为热备盘)组建一组raid5磁盘阵列。存储设备一共创建了2组Mdisk,加到一个pool中。 服务器故障: IBM V…

网络管理与维护(三)网络安全

网络安全 网络安全威胁 非授权访问 信息泄漏 破坏数据完整性 拒绝服务攻击 利用网络传播病毒 安全服务和安全机制 总结 1.通常可以把网络信息安全的问题划分为物理层、网络层、数据层和内容层四个层面。 2.网络存在的威胁主要表现: 非授权访问、信息泄漏、破坏数…

基于Django+Vue开发的社区疫情管理系统(附源码)

基于Django、Django Rest framework、Vue的前后端分离的社区疫情管理系统。 一、系统功能 用户管理(只有管理员有权限) 用户注册用户登录修改用户信息删除用户修改密码权限管理 首页数据展示 国内疫情数据展示国内疫情新闻近30日的感染人数(…