APP自动化测试 ------ 滑动和拖拽事件操作!

前言

Appium自动化测试中的常见模拟操作涵盖了多种用户交互行为,这些操作对于自动化测试框架来说至关重要,因为它们能够模拟真实用户的使用场景,从而验证应用程序的功能和稳定性。

今天讲解滑动和拖拽事件操作:

1、swipe滑动事件

示例:driver.swipe(startx, starty, endx, endy, duration=None)

说明:duration用来降低滑屏的速度及惯性, 单位是ms

2、swipe滑动事件封装

# 定义一个封装滑屏操作的方法def slide_screen(driver, direction, count=1):    w = driver.get_window_size()["width"]  # 获取手机屏幕的宽度    h = driver.get_window_size()["height"] # 获取手机屏幕的高度    # w=1080  h=1920    if direction == "up":  # 往上滑        zb = (w/2, h*0.9, w/2, h*0.1)    elif direction == "down":  # 往下滑        zb = (w/2, h*0.1, w/2, h*0.9)    elif direction == 'left':  # 往左滑        zb = (w*0.9, h/2, w*0.1, h/2)    elif direction == 'right':   # 往右滑        zb = (w*0.1, h/2, w*0.9, h/2)    else:        print("无法识别滑动方向,请重新输入!")    for i in range(count):        driver.swipe(*zb, duration=1200)        time.sleep(1)

3、swipe边滑动边查找封装

目的:针对频道类的元素进行滑动选择对应的频道

# 封装一个边滑动边查找的方法def search_while_sliding(driver, element, element_info):    ele_size = element.size  # 获取元素大小    width = ele_size["width"]  # 获取元素的宽度    height = ele_size["height"]  # 获取元素的高度    # 获了element元素左上角点的坐标    ele_position = element.location    x = ele_position["x"]  # 获取左上角点的x坐标值    y = ele_position["y"]  # 获取左上角点的y坐标值
    start_x = x + width*0.9  # 获取的是起始点X的值    y = y + height*0.5  # 获取的是起始及终止点的Y的值    end_x = x + width*0.1   # 获取的是终止点X的值    while True:        page = driver.page_source  # 记录查找前的页面资源,通过对比页面资源来退出死循环        try:            driver.find_element(*element_info).click()  # 如果有找到对应的元素那么点击并返回            return True        except Exception as e:            print("没有找到该元素!")        driver.swipe(start_x, y, end_x, y, duration=1000)  # 没有找到元素,那么滑屏后再对比并重新查找        time.sleep(1)        if page == driver.page_source:            print("滑屏操作完成且没有找到元素信息")            return False

备注:

  • while True:创建一个无限循环。

  • page = driver.page_source:记录查找前的页面资源,用于后续对比以判断是否退出循环。

  • driver.find_element(*element_info).click():尝试查找并点击指定元素,如果找到则返回True。

  • except Exception as e:如果没有找到元素,打印提示信息。

  • driver.swipe(start_x, y, end_x, y, duration=1000):没有找到元素时,执行滑屏操作。

  • time.sleep(1):等待一段时间。

  • if page == driver.page_source:如果滑屏操作完成后页面资源没有变化,说明没有找到元素,打印相关提示并返回False.

4、scroll滑动事件

示例:

driver.scroll(source_element, target_element)

说明:scroll是通过元素来进行滑动的

  • source_element表示原元素;target_element表示目标元素,滑动原理是由原元素拖动到目标元素的位置

  • scroll无法设置滑动的持续时间,带有一定惯性。主要用于IOS中,android高版本系统可以使用。

import timefrom appium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom appium.options.android import UiAutomator2Optionsfrom selenium.webdriver.support import expected_conditions as EC  # 定义一个初始化APP的方法def start_app(app_package, app_activity):     # 定义desired_caps 字典,初始化app的配置信息    desired_caps = {        "platformName": "android",  # 表示的是android        "platformVersion": "10",  # 表示的是设备系统的版本号        "deviceName": "DWV6R19A10002101",  # 表示的是设备的ID名称        "appPackage": app_package,  # 表示的是app的包名        "appActivity": app_activity,  # 表示的是app的界面名        "newCommandTimeout": 100000,        "noReset": True,  # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作        "resetKeyboard": True,  # 重置设备的输入键盘        "unicodeKeyboard": True  # 采用unicode编码输入    }    # 创建 Appium 驱动实例    options = UiAutomator2Options().load_capabilities(desired_caps)    driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)     # 启动应用程序    driver.wait_activity(desired_caps, 5)    return driver  # 定义一个获取元素的方法def get_element_new(driver, element):    element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))    return element  if __name__ == "__main__":    # 本次启动的应用程序包名和活动名(作业帮)    app_package_zyb = "com.baidu.homework"    app_activity_zyb = ".activity.index.IndexActivity"     # 启动应用程序    driver_zyb = start_app(app_package_zyb, app_activity_zyb)     # 进入「我的」tab    my_tab = (By.XPATH, '//android.widget.RelativeLayout[@resource-id="com.baidu.homework:id/tab_my_layout"]')    get_element_new(driver_zyb, my_tab).click()     # 找到「我的活动」元素    My_activities = (By.XPATH, '//android.widget.TextView[@resource-id='                               '"com.baidu.homework:id/user_item_title" and @text="我的活动"]')    my_activities = get_element_new(driver_zyb, My_activities)     # 找到「我的订单」元素    my_order = (By.ID, 'com.baidu.homework:id/user_item_title')    my_order_element = get_element_new(driver_zyb, my_order)     # 滑动    driver_zyb.scroll(my_activities, my_order_element)     # 关闭驱动    time.sleep(3)    print("代码执行完毕")    driver_zyb.quit()

5、drag_and_drop拖拽事件

原理:从一个元素滑动到另外一个元素的位置, 同时也能实现将一个元素拖动另一个元素当中。

示例:

driver.drag_and_drop(source_element, target_element)

说明:

  • source_element 表示的是被拖动的元素对象

  • target_element 表示的是目标元素对象

import timefrom appium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom appium.options.android import UiAutomator2Optionsfrom selenium.webdriver.support import expected_conditions as EC# 定义一个初始化APP的方法def start_app(app_package, app_activity):
    # 定义desired_caps 字典,初始化app的配置信息    desired_caps = {        "platformName": "android",  # 表示的是android        "platformVersion": "10",  # 表示的是设备系统的版本号        "deviceName": "DWV6R19A10002101",  # 表示的是设备的ID名称        "appPackage": app_package,  # 表示的是app的包名        "appActivity": app_activity,  # 表示的是app的界面名        "newCommandTimeout": 100000,        "noReset": True,  # 用来记住app的session,如果有登陆或做过初始化的操作,为True时,后面不需要再操作        # "resetKeyboard": True,  # 重置设备的输入键盘 (连接虚拟机时使用)        # "unicodeKeyboard": True  # 采用unicode编码输入(连接虚拟机时使用)    }    # 创建 Appium 驱动实例    options = UiAutomator2Options().load_capabilities(desired_caps)    driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options)
    # 启动应用程序    driver.wait_activity(desired_caps, 5)    return driver# 定义一个获取元素的方法def get_element_new(driver, element):    element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(element))    return elementif __name__ == "__main__":    # 本次启动的应用程序包名和活动名(作业帮)    app_package_zyb = "com.baidu.homework"    app_activity_zyb = ".activity.index.IndexActivity"
    # 启动应用程序    driver_zyb = start_app(app_package_zyb, app_activity_zyb)
    # 进入「我的」tab    my_tab = (By.XPATH, '//android.widget.RelativeLayout[@resource-id="com.baidu.homework:id/tab_my_layout"]')    get_element_new(driver_zyb, my_tab).click()
    # 找到「我的活动」元素    My_activities = (By.XPATH, '//android.widget.TextView[@resource-id='                               '"com.baidu.homework:id/user_item_title" and @text="我的活动"]')    my_activities = get_element_new(driver_zyb, My_activities)
    # 找到「我的订单」元素    my_order = (By.ID, 'com.baidu.homework:id/user_item_title')    my_order_element = get_element_new(driver_zyb, my_order)
    # 通过拖动来实现滑屏操作    driver_zyb.drag_and_drop(my_activities,  my_order_element)
    # 关闭驱动    time.sleep(3)    print("代码执行完毕")    driver_zyb.quit()

下期分享:高级手势操作&toast操作,欢迎关注!

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

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

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

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

相关文章

java-数据结构与算法-02-数据结构-07-优先队列

1. 概念 队列是一种先进先出的结构,但是有些时候,要操作的数据带有优先级,一般出队时,优先级较高的元素先出队,这种数据结构就叫做优先级队列。 比如:你在打音游的时候,你的朋友给你打了个电话…

springboot短视频推荐系统-计算机毕业设计源码21503

摘 要 本论文基于协同过滤算法,旨在设计并实现一种基于SpringBoot框架的短视频推荐系统。该系统主要分为平台用户和管理员两类角色,用户可以注册、登录、浏览短视频内容,并根据个人兴趣收藏喜爱的视频。管理员则可以管理系统数据、用户和内容…

nginx反向代理和负载均衡+安装jdk-22.0.2

ps -aux|grep nginx //查看进程 nginx 代理 nginx代理是负载均衡的基础 主机:192.168.118.60 这台主机只发布了web服务,没有做代理的任何操作 修改一下index.html中的内容 echo "this is java web server" > /usr/local/nginx/htm…

JVM性能调优全指南:高流量电商系统的最佳实践

1.G1(Garbage-First) 官网: G1 Garbage Collection G1收集器是Java 7中引入的垃圾收集器,用于替代CMS(Concurrent Mark-Sweep)收集器。它主要针对大内存、多核CPU环境下的应用场景,具有以下特点: 分代收集:G1仍然保留了分代的概念,但新生代和老年代不再是物理隔离的,…

线程的同步互斥

互斥 互斥保证了在一个时间内只有一个线程访问一个资源。 先看一段代码&#xff1a;三个线程同时对全局变量val进行--&#xff0c;同时val每自减一次其线程局部存储的全局变量 #include <iostream> #include <thread> #include <vector> #include <uni…

Java之Java基础十六(反射)

一、什么是反射 一般情况下&#xff0c;我们在使用某个类之前已经确定它到底是个什么类了&#xff0c;拿到手就直接可以使用 new 关键字来调用构造方法进行初始化&#xff0c;之后使用这个类的对象来进行操作。 Writer writer new Writer(); writer.setName("aaa"…

WPF的MVVM架构:如何通过数据绑定简化UI逻辑

WPF的MVVM架构&#xff1a;如何通过数据绑定简化UI逻辑 目录 MVVM模式概述数据绑定在MVVM中的作用实现MVVM模式的步骤MVVM模式中的常见问题与解决方案实践示例总结 MVVM模式概述 MVVM&#xff08;Model-View-ViewModel&#xff09;是一种设计模式&#xff0c;用于WPF应用程序…

超声波传感器 - 从零开始认识各种传感器【第十九期】

超声波传感器|从零开始认识各种传感器 1、什么是超声波传感器 超声波传感器是一种利用超声波来进行距离测量和目标检测的传感器。它通过发送&#xff0c;超声波脉冲&#xff0c;并测量超声波从传感器发射到目标物体并返回的时间来计算目标物体与传感器之间的距离。 超声波传感…

echarts无数据的展示内容,用graphic属性配置

echarts无数据的展示内容&#xff0c;用graphic属性配置 当echarts无数据的时候&#xff0c;图表展示的是个空白部分&#xff0c;感觉会有点丑&#xff0c;影响页面美观&#xff0c;这时候翻阅了echarts的官网&#xff0c;让我找到个配置项&#xff0c;试试发现还可以&#xf…

Notion支持直接绑定自己的域名,有何工具可替代为公开网站自定义域名?

Notion最近大招频出&#xff0c;推出新功能——自定义域名。只需简单几步&#xff0c;xxx.notion.site秒变你的专属域名&#xff08;月费仅需10美金&#xff09;。推特上的独立内容创作者/初创公司&#xff0c;用它来打造品牌、分享资料模板&#xff0c;甚至实现盈利。 Notion的…

你还在为PDF转Word烦恼?试试这四款免费工具吧!

悄咪咪问一句&#xff0c;大家在平时上班时最头疼的事情有哪些&#xff1f;我想会有很多朋友也有pdf如何在线转换word文档的免费方式&#xff0c;毕竟这些办公文档是非常常见的问题了&#xff0c;所以今天就专门准备这么一篇文章来分享我个人喜欢的四款好用工具&#xff1a; 第…

做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?

hello,我是阿磊&#xff0c;一个20年的码农&#xff0c;6年前代码写不动了&#xff0c;转型专职做副业项目研究&#xff0c;为劳苦大众深度挖掘互联网副业项目&#xff0c;共同富裕。 现在做知识付费项目还能做吗&#xff1f; 互联网虚拟资源项目我一直在做&#xff0c;做了有…

【单片机毕业设计选题24088】-基于STM32的智能家居控制系统

系统功能: 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用智能家居系统请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后显示第一页面&#xff0c;如长时间显示Connecting...请 检查WiFi网络是否正确。 第一页面第一行…

使用runlink通过容器打印出容器的启动命令

1、Runlike简介 Runlike:通过容器打印出容器的启动命令&#xff0c;然后发现自己需要手动重新运行一些容器的人来说&#xff0c;这是一个真正的节省时间。 2、Docker镜像安装 2.1 构建Runlike容器 [rootlocalhost ~]# docker run --rm -v /var/run/docker.sock:/var/run/do…

嵌入式Linux:符号链接(软链接)和硬链接

目录 1、符号链接&#xff08;软链接&#xff09; 2、硬链接 3、link()函数 4、symlink()函数 5、readlink()函数 在 Linux 系统中&#xff0c;符号链接&#xff08;软链接&#xff09;和硬链接是两种创建文件链接的方法。理解它们的区别和使用场景对于文件系统的管理非常…

Spring核心机制Ioc和Aop

Spring全家桶 WEB&#xff1a;SpringMvc、Spring Web Flux 持久层&#xff1a;Spring Data、Spring Data Redis、Spring Data MongoDB 安全校验&#xff1a;spring Security 构建工程脚手架&#xff1a;SpringBoot 微服务&#xff1a;SpringCloud 所有的Spring框架集成&#xf…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

ctfshow 权限维持 web670--web679

web670 <?php// 题目说明&#xff1a; // 想办法维持权限&#xff0c;确定无误后提交check&#xff0c;通过check后&#xff0c;才会生成flag&#xff0c;此前flag不存在error_reporting(0); highlight_file(__FILE__);$a$_GET[action];switch($a){case cmd:eval($_POST[c…

OCC BRepOffsetAPI_ThruSections使用

目录 一、BRepOffsetAPI_ThruSections简介 二、功能与特点 三、应用场景 四、示例 一、BRepOffsetAPI_ThruSections简介 在Open CASCADE Technology (OCCT) 中,BRepOffsetAPI_ThruSections 类是用来通过放样生成一个实体或者一个面壳(Shell)。当使用这个类时,isSolid 参…