05 APP 自动化- Appium 单点触控 多点触控

文章目录

      • 一、单点触控
          • 查看指针的指针位置
          • 实现手势密码:
      • 二、多点触控

一、单点触控

查看指针的指针位置

方便查看手势密码-九宫格每个点的坐标

实现手势密码:
  • 执行手势操作: 按压起点 -> 移动到下一点 -> 依次移动 -> 释放,最后调用perform()
  • 实现的效果如下图:
  • 代码实现:
# -*- coding=utf-8 -*-
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
# 旧方法(TouchAction,已弃用)
# 新方法(W3C Actions API)
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.actions import interaction
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver.common.actions.pointer_input import PointerInput# 设置操作终端的配置参数
desired_caps = dict(platformName='Android', # 指定操作系统platformVersion='12',# 指定操作系统版本automationName='Uiautomator2',# 默认框架deviceName='127.0.0.1:62001',# 指定设备名称appPackage='com.mymoney',# 被操作的应用程序包名appActivity='com.mymoney.biz.splash.SplashScreenActivity',# 启动页面noReset='true',# true--不重置  false--重置app='F:\Pycharm\AppAuto\Mymoney_v13.2.18.apk'  # apk文件所在路径
)
# 发送命令给 appium server
driver = webdriver.Remote('http://127.0.0.1:4723', options=UiAutomator2Options().load_capabilities(desired_caps))
# 打开随手记app->进入我的页面->点击设置一栏->点击密码保护一栏->开启密码保护->点击手势密码->进入手势密码设置页面
# 1. 初始化 ActionChains 和触摸输入源
actions = ActionChains(driver)
actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch"))# 2. 定义手势轨迹的坐标点(假设已确定坐标,或从 bounds 解析计算 )
# 示例坐标,需根据实际应用调整
point_1 = (345, 384)
point_2 = (540, 384)
point_3 = (740, 384)
point_5 = (540, 580)
point_7 = (345, 780)
point_8 = (540, 780)
point_9 = (740, 780)# 3. 执行手势操作:按压起点 -> 移动到下一点 -> 依次移动 -> 释放
actions.w3c_actions.pointer_action.move_to_location(*point_1)  # 移动到起点(不按压时,可先移动调整位置)
actions.w3c_actions.pointer_action.pointer_down()  # 按压起点
actions.w3c_actions.pointer_action.pause(0.5)  # 暂停 0.5 秒,模拟真实触摸停顿actions.w3c_actions.pointer_action.move_to_location(*point_2)  # 移动到点 2
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.move_to_location(*point_3)  # 移动到点 3
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.move_to_location(*point_5)  # 移动到点 5
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.move_to_location(*point_7)  # 移动到点 7
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.move_to_location(*point_8)  # 移动到点 8
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.move_to_location(*point_9)  # 移动到点 9
actions.w3c_actions.pointer_action.pause(0.5)actions.w3c_actions.pointer_action.release()  # 释放触摸# 4. 执行动作链
actions.perform()

二、多点触控

以放大缩小图片为例:

# -*- coding=utf-8 -*-
from time import sleepfrom appium import webdriver
from appium.options.android import UiAutomator2Options
# 旧方法(TouchAction,已弃用)
# 新方法(W3C Actions API)
from selenium.webdriver.common.actions import interaction
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from appium.webdriver.common.appiumby import AppiumBy# 设置操作终端的配置参数
desired_caps = dict(platformName='Android', # 指定操作系统platformVersion='12',# 指定操作系统版本automationName='Uiautomator2',# 默认框架deviceName='127.0.0.1:62001',# 指定设备名称appPackage='com.android.browser',# 被操作的应用程序包名noReset='true',# true--不重置  false--重置
)
# 发送命令给 appium server
driver = webdriver.Remote('http://127.0.0.1:4723', options=UiAutomator2Options().load_capabilities(desired_caps))
# 打开系统自带浏览器->进入百度搜索页面->任意搜索一张图片->进入图片页面
# 定位到需要缩放的元素(如图片)
element = driver.find_element(AppiumBy.ID,"com.android.browser:id/main_content")
element_location = element.location  # 获取元素位置
element_size = element.size          # 获取元素尺寸# 计算缩放中心点
center_x = element_location['x'] + element_size['width'] / 2
center_y = element_location['y'] + element_size['height'] / 2# 定义双指初始位置和目标位置(根据缩放方向调整)
# 示例:双指从中心向两侧张开(放大)
start_x1 = center_x - 50  # 左手指起始位置
start_y1 = center_y
end_x1 = center_x - 150   # 左手指终点位置
end_y1 = center_ystart_x2 = center_x + 50  # 右手指起始位置
start_y2 = center_y
end_x2 = center_x + 150   # 右手指终点位置
end_y2 = center_y# 创建 ActionBuilder 并添加两个触摸输入源(手指)
actions = ActionBuilder(driver)#---------------------放大图片---------------------------
# 第一根手指(左手)的操作
finger1 = actions.add_pointer_input(interaction.POINTER_TOUCH, "finger1")
finger1.create_pointer_move(duration=0, x=start_x1, y=start_y1)  # 移动到起始位置
finger1.create_pointer_down()  # 按下
finger1.create_pointer_move(duration=500, x=end_x1, y=end_y1)  # 移动到终点(模拟张开)
finger1.create_pointer_up(button=0)    # 抬起# 第二根手指(右手)的操作(与第一根手指同时进行)
finger2 = actions.add_pointer_input(interaction.POINTER_TOUCH, "finger2")
finger2.create_pointer_move(duration=0, x=start_x2, y=start_y2)  # 移动到起始位置
finger2.create_pointer_down()  # 按下(与第一根手指同步)
finger2.create_pointer_move(duration=500, x=end_x2, y=end_y2)  # 移动到终点(模拟张开)
finger2.create_pointer_up(button=0)    # 抬起# 执行多点触控操作
actions.perform()sleep(3)#---------------------缩小图片---------------------------
# 第一根手指(左手)的操作
finger3 = actions.add_pointer_input(interaction.POINTER_TOUCH, "finger3")
finger3.create_pointer_move(duration=0, x=end_x1, y=end_y1)  # 移动到起始位置
finger3.create_pointer_down()  # 按下
finger3.create_pointer_move(duration=500, x=start_x1, y=start_y1)  # 移动到终点(模拟张开)
finger3.create_pointer_up(button=0)    # 抬起# 第二根手指(右手)的操作(与第一根手指同时进行)
finger4 = actions.add_pointer_input(interaction.POINTER_TOUCH, "finger4")
finger4.create_pointer_move(duration=0, x=end_x2, y=end_y2)  # 移动到起始位置
finger4.create_pointer_down()  # 按下(与第一根手指同步)
finger4.create_pointer_move(duration=500, x=start_x2, y=start_y2)  # 移动到终点(模拟张开)
finger4.create_pointer_up(button=0)    # 抬起# 执行多点触控操作
actions.perform()

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

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

相关文章

【软件】在 macOS 上安装 MySQL

在 macOS 上安装 MySQL 有多种方法,以下是两种常见的安装方式:通过 Homebrew 安装和通过安装包安装。以下是详细的步骤: 一、通过 Homebrew 安装 MySQL Homebrew 是 macOS 的包管理器,使用它安装 MySQL 非常方便。 1.安装 Home…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法:递归 计算二叉树的直径可以理解…

OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 CUDA 加速的 Canny 边缘检测器对象(CannyEdgeDetector),可以在 GPU 上高效执行 Canny 边…

unix/linux,sudo,其内部结构机制

我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…

什么是 TOML?

🛠 Rust 配置文件实战:TOML 语法详解与结构体映射( 在 Rust 中,Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项,还使用了一种轻巧易读的配置语言:TOML。 本文将深入解析 TOML 的语法…

react native webview加载本地HTML,解决iOS无法加载成功问题

在react native中使用 “react-native-webview”: “^13.13.5”,加载HTML文件 Android: 将HTML文件放置到android/src/main/assets目录,访问 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native项目下,访问…

数据结构(JAVA版)练习题

(题目难易程度与题号顺序无关哦) 目录 1、多关键字排序 2、集合类的综合应用问题 3、数组排序 4、球的相关计算问题 5、利用类对象计算日期 6、日期计算问题 7、星期日期的计算 8、计算坐标平面上两点距离 9、异常处理设计问题 10、Java源文件…

04-redis-分布式锁-redisson

1 基本概念 百度百科:控制分布式系统之间同步访问共享资源方式。 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飙升的问题记录

最近,看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣,参考了视频博主的流程,自己做了下对应案例的实战演练,在此,想做一下,针对相关问题模拟与排查演练的实战过程记录。 案例中…

Sql Server 中常用语句

1.创建用户数据库 --创建数据库 use master --切换到master数据库 go-- 终止所有与SaleManagerDB数据库的连接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…

联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案

在当今数字化飞速发展的时代,中小企业面临着日益增长的业务需求与复杂多变的市场竞争环境。如何构建高效、稳定且具性价比的 IT 架构,成为众多企业突破发展瓶颈的关键所在。而亿林网络推出的 24 核 32G 裸金属服务器,搭配联通专线的千兆共享带…

LangChain核心之Runnable接口底层实现

导读:作为LangChain框架的核心抽象层,Runnable接口正在重新定义AI应用开发的标准模式。这一统一接口设计将模型调用、数据处理和API集成等功能封装为可复用的逻辑单元,通过简洁的管道符语法实现复杂任务的声明式编排。 对于面临AI应用架构选择…

CSP严格模式返回不存在的爬虫相关文件

文章目录 说明示例(返回404)示例(创建CSP例外) 说明 日期:2025年6月4日。 CSP严格模式是default-src none,但有些web应用中,在爬虫相关文件不存在的情况下,依旧返回了对应文件&…

DeviceNET从站转EtherNET/IP主站在盐化工行业的创新应用

在工业自动化飞速发展的今天,盐化工行业也在积极探索智能化升级的路径。其中,设备之间的高效通信与协同工作成为了提升生产效率和质量的关键。而JH-DVN-EIP疆鸿智能DeviceNET从站转EtherNET/IP主站的技术应用,为盐化工行业带来了全新的解决方…

安装 Nginx

个人博客地址:安装 Nginx | 一张假钞的真实世界 对于 Linux 平台,Nginx 安装包 可以从 nginx.org 下载。 Ubuntu: 版本Codename支持平台12.04precisex86_64, i38614.04trustyx86_64, i386, aarch64/arm6415.10wilyx86_64, i386 在 Debian/Ubuntu 系统…

默认网关 -- 负责转发数据包到其他网络的设备(通常是路由器)

✅ 默认网关概括说明: 默认网关(Default Gateway)是网络中一台负责转发数据包到其他网络的设备(通常是路由器)。当一台主机要访问不在本地子网内的设备时,会将数据包发给默认网关,由它继续转发…

cv::FileStorage用法

cv::FileStorage 是 OpenCV 中的一个类,用于读取和写入结构化数据(如 YAML、XML、JSON)。它非常适合保存和加载诸如: 相机内参(K、D) 位姿(R、T) IMU 数据 配置参数 向量、矩阵、…

WebFuture:启动服务提示Job webfuture.service/start failed with result ‘dependency‘处理办法

问题分析: 当出现 Job webfuture.service/start failed with result dependency. 这样的错误提示时,通常意味着 webfuture.service 这个服务在启动时因为依赖关系的问题而未能成功启动 解决办法: 原因分析: webfuture.service 可…