技术分享 | app自动化测试(Android)--触屏操作自动化
导入TouchAction
- Python 版本
from appium.webdriver.common.touch_action import TouchAction
- Java 版本
import io.appium.java_client.TouchAction;
常用的手势操作
press 按下
TouchAction 提供的常用的手势操作有如下操作:
-
press 按下
-
release 释放
-
move_to/moveTo 移动
-
tap 点击
-
long_press/longPress 长按
-
wait 等待
-
cancel 取消
-
perform 执行
TouchAction 提供的 press( ) 方法可以实现对元素或者坐标的按下操作。通常会结合 release( ) 方法实现对某个元素的点击(包括按下和抬起两个动作)。
在某个控件上执行 press 操作,用法如下:
- Python 版本
按下某个元素,用法如下:
press(WebElement el)
在坐标为(x,y)的点执行 press 操作,用法如下:
press(int x, int y)
- Java 版本
在坐标为(x,y)的点执行 press 操作,用法如下:
press(int x, int y)
release 释放
释放操作,可以结合其它的事件使用。代表该系列动作的一个结束标志。在某个控件上执行释放操作,用法如下:
- Python 版本
release(WebElement el)
也可以在上一个操作结束之后执行 release,不添加任何参数,用法如下:
release()
- Java 版本
release()
移动
以控件为目标,从一个点移动到该目标上,用法如下:
- Python 版本
move_to(WebElement el)
以(x,y)点为目标,从一个点移动到该目标,用法如下:
move_to(WebElement el, int x, int y)
- Java 版本
以(x,y)点为目标,从一个点移动到该目标,用法如下:
moveTo(WebElement el, int x, int y)
tap 点击
在某个控件的中心点上点击一下,用法如下:
- Python 版本
tap(WebElement el)
以控件 el 的左上角为基准,沿着 x 轴向右移动 x 单位,沿着 y 轴向下移动 y 单位。在该点上点击,用法如下:
tap(WebElement el, int x, int y)
以(x,y)坐标点为目标点击,用法如下:
tap(int x, int y)
- Java版本
只提供坐标点击,用法如下:
tap(int x, int y)
长按
长按某一控件,用法如下:
- Python 版本
long_press(WebElement el)
以(x,y)点为目标实现长按,用法如下:
long_press(int x, int y)
在控件的左上角的 x 坐标偏移 x 单位,y 左边偏移 y 单位的坐标上长按。用法如下:
long_press(WebElement el, int x, int y)
- Java 版本
只提供坐标点击,用法如下:
longPress(int x, int y)
等待
等待,单位为毫秒。可以在操作事件的过程中,短暂的停留几秒再继续操作。用法如下:
- Python 版本
wait(long timeout)
- Java 版本
wait(long timeout)
cancel 取消
可以取消执行事件链中的事件,用法如下:
- Python 版本
cancel()
- Java 版本
cancel()
执行 perform
执行事件链中的事件,一般最后会调用这个方法,顺序执行事件链中的动作。用法如下:
- Python 版本
perform()
- Java 版本
perform()
案例
打开测试应用,从元素 “Views” 文本滑动到 “Accessibility” 元素,创建一个测试文件代码如下:
测试 app 官方下载地址:github.com/appium/appi…
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 测试文件 test_touchaction.py
from appium import webdriver
from appium.webdriver.common.touch_action import TouchActionclass TestTouchAction():def setup(self):caps = {}caps['platformName'] = 'Android'caps['platformVersion'] = '6.0'caps['deviceName'] = 'emulator-5554'caps['appPackage'] = 'io.appium.android.apis'caps['appActivity'] = 'io.appium.android.apis.ApiDemos'self.driver = webdriver.Remote(\"http://127.0.0.1:4723/wd/hub", caps)self.driver.implicitly_wait(5)def teardown(self):self.driver.quit()def test_touchaction_unlock(self):# 点击 Viewsel1 = self.driver.find_element_by_accessibility_id("Views")# 点击 Accessibilityel2 = self.driver.find_element_by_accessibility_id("Accessibility")# TouchAction 滑动操作action = TouchAction(self.driver)action.press(el1).wait(100).move_to\(el2).wait(100).release().perform()
public class TouchActionTest {static AppiumDriver driver;@BeforeAllpublic static void beforeAll() throws MalformedURLException {DesiredCapabilities caps = new DesiredCapabilities();caps.setCapability("deviceName", "emulator-5554");caps.setCapability("platformName", "Android");caps.setCapability("appPackage", "io.appium.android.apis");caps.setCapability("appActivity", "io.appium.android.apis.\ApiDemos");URL appiumServer = new URL("http://127.0.0.1:4723/wd/hub");driver = new AndroidDriver(appiumServer, caps);driver.manage().timeouts().implicitlyWait(10, \TimeUnit.SECONDS);}@Testvoid test() {// 创建 TouchAction 对象TouchAction action = new TouchAction<>(driver);// TouchAction 滑动操作action.press(PointOption.point((int) (width * 0.5), \(int) (height * 0.8))).waitAction(WaitOptions.\waitOptions(Duration.ofSeconds(2))).moveTo(\PointOption.point((int) (width * 0.5), \(int) (height * 0.2))).release().perform();}}
以上两段代码实现了相同的操作,创建了一个 TouchAction 对象,调用里面的 press() 方法实现起点元素的点击,使用 wait() 方法在事件之间添加等待,使用 move_to()/moveTo() 方法完成手势的移动操作,然后调用 release() 方法来完成手势的抬起,最后调用 perform() 方法对添加到 TouchAction 中的事件链顺序执行。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:
技术分享 | app自动化测试(Android)--触屏操作自动化
导入TouchAction Python 版本 from appium.webdriver.common.touch_action import TouchAction Java 版本 import io.appium.java_client.TouchAction; 常用的手势操作 press 按下 TouchAction 提供的常用的手势操作有如下操作: press 按下 release 释放 …...
Java连接数据库并查询表中的全部数据
1、导入相关jar包 这里创建简单的maven项目,我们导入相关的jar包 相关依赖: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…...
STM32存储左右互搏 SPI总线读写FLASH W25QXX
STM32存储左右互搏 SPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元,W25QXX系列Flash有不同容量的型号,如W25Q64的容量为64Mbit,也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库操作W25Q各型号FLASH的例程。 W25QXX介绍 W25QX…...
【EI会议征稿】第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)
第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024) 2024 4th International Conference on Computer Network Security and Software Engineering 第四届计算机网络安全与软件工程国际学术会议(CNSSE 2024)将于2024年2月…...
解决pip 安装 pyhash错误
1 pip 安装 pyhash错误 Collecting pyhash (from Calvin0.0.1) Using cached https://pypi.tuna.tsinghua.edu.cn/packages/f0/bf/4db9bed05d10824a17697f65063de19892ca2171a31a9c6854f9bbf55c02/pyhash-0.9.3.tar.gz (602 kB) Preparing metadata (setup.py) … error error:…...
解决 win11 vmware 中centos 网络不能访问外网
解决 win11 vmware 中centos 网络不能访问外网 1、进入win11 高级设置,找到centos 虚拟机使用的网卡 2、看网卡的其他属性 3、按照红圈部分,配置成一样的就行 4、进入到虚拟机配置中,配置成如图一样的NAT模式 5、再进入编辑 -》虚拟网络编辑…...
Flutter vs 前端 杂谈:SliverAppBar、手动实现Appbar、前端Html+JS怎么实现滚动变化型Appbar - 比较
Flutter vs 前端 杂谈 SliverAppBar的弹性背景的显隐效果使用HtmlJS怎么实现 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550…...
Qt 二维码生成与识别
1.简介 QZXing是一个基于Qt框架的二维码解码库,它是对ZXing(Zebra Crossing)开源项目的一个Qt封装。ZXing是一个功能强大的开源二维码解码库,支持多种类型的码,包括QR码、DataMatrix码、Aztec码等。 QZXing提供了一个…...
jacoco和sonar
目录 jacoco 引入依赖 构建配置修改 单元测试 生成报告 查看报告 报告说明 1. Instructions 2. Branches 3. Cyclomatic Complexity 4. Lines 5. Methods 6. Classes sonar7.7 基础环境 需要下载软件 解压文件并配置 运行启动 jacoco 引入依赖 <dep…...
Django系列之Serializer的source参数使用、自定义序列化方法
数据准备 models.py from django.contrib.auth.models import AbstractUser from django.db import modelsclass Publish(models.Model):name models.CharField(max_length32)city models.CharField(max_length8)email models.CharField(max_length32)def __str__(self):r…...
Java从入门到精通
Java从入门到精通 1. Java概述1.1 Java是什么1.2 为什么用Java1.3 Java能做什么1.4 Java技术体系平台2. Java快速入门2.1 Java开发环境的准备:JDK简介、安装、常用命令如何使用JavaJDK产品的发展史获取JDK如何验证能用javac和java其他常用命令行命令2.2 Java入门程序-HelloWor…...
电路布线问题动态规划详解(做题思路)
对于电路布线问题,想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计,要求用导 线(i,π(i))将上端接线柱与下端接线柱相…...
webpack 的 Loader 和 Plugin 的区别,常见的 loader 和 plugin 有哪些?
结论先行: 1、 Loader 和 Plugin 的区别 Loader 也叫做就是“加载器”,因为 webpack 原生只能解析 js 文件,而对于其他类型文件,则需要借助 loader。所以 loader 的作用就是实现对不同格式文件的解析和处理,例如把 E…...
云计算实战项目之---学之思在线考试系统
简介: 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机和手机等设备。 支持多种部署方式:集成部署、前后端分离部署、docker部…...
研究生学术与职业素养讲座MOOC---期末复习(1-15)
目录 单选题多选题填空题判断题 单选题 我国制造科学与技术与工业发达国家相比的阶段性差距不包括:人工成本高不属于面向产业的学科:哲学哪个国际前沿本讲未提:纳米技术早期的科学研究不分学科是以达芬奇为例说的待遇不是管理者与领导者的区…...
kube-prometheus-stack监控k8s1.24+ docker缺少图像
1.24 中 cAdvisor 指标中缺少图像、名称和容器标签 由于 Kubernetes 1.24 已经从 cadvisor 中删除了 docker 插件,因此虽然可以使用 cri-dockerd 来适配容器运行时,但 cadvisor 无法获取有关图像标签等 docker 容器信息。进而导致 grafana 很多图像无数据。解决方法为对 pro…...
【C/PTA——循环结构3】
C/PTA——循环结构3 7-1 二分法求多项式单根1.题目要求2.代码实现 7-2 循环-十进制转化1.题目要求2.代码实现 7-3 梅森数1.题目要求2.代码实现 7-4 单词长度1.题目要求2.代码实现 7-5 21循环-求和31.题目要求2.代码实现 7-6 21循环-金字塔1.题目要求2.代码实现 7-7 循环-杨辉三…...
MAC设备(M1)环境下编译安装openCV for Java
最近发现一个需求,可以用openCV来实现,碰巧又新买了mac笔记本,就打算利用业余时间安装下openCV。这里将主要步骤记录下,希望能帮助有需要的人。 1、准备编译环境 #查询编译opencv相关依赖 brew info opencv查询结果如下图所示&a…...
pytest中的pytest.ini
[pytest] filterwarnings ignore::DeprecationWarning addopts -v -s markers uat:1 smok:2 log_cli1 xfail_strict True filterwarnings ignore::DeprecationWarning 这个的功能就是 test_login.py::Test_login::test_login_correct_password PASSEDwarnings summary …...
C#通过TCP发送List<string>
using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Collections.Generic;public static void SendList<string>(Stream stream, List<string> list) {// 将List<string>对象转换为字节数组byte[] data Encoding.U…...
新手福音:在快马平台开启你的云端代码编程第一课
作为一名刚接触编程的新手,我最近发现了一个特别适合入门的学习方式——云端代码编程。以前总觉得学编程要先装一堆软件、配置环境,光是这些准备工作就能劝退不少人。但在InsCode(快马)平台上,这些烦恼都不存在了。 零门槛的编程初体验 打开平…...
BI 项目交付 SOP
...
汽车动力性能计算工具插件:一键测算电机需求与整车性能,工程师专属轻量级辅助软件
温馨提示:文末有联系方式插件核心功能亮点 本款汽车动力性系统专用计算小工具,可精准推演电机功率与扭矩需求,同步输出整车加速性能、最大爬坡度、最高稳定车速等关键动力参数,覆盖常规工况与典型驱动场景,满足前期方案…...
**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**在物联网(IoT)飞速发展的今天,传统云
雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现 在物联网(IoT)飞速发展的今天,传统云计算模式已难以满足低延迟、高带宽和实时响应的需求。**雾计算(Fog Computing)**作为云与终端设备之间的…...
大麦抢票自动化工具:技术赋能下的抢票效率革命
大麦抢票自动化工具:技术赋能下的抢票效率革命 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在热门演出门票抢购场景中,用户常常面临手动操作反应迟缓、重复劳动效率低下…...
3分钟让Windows 11脱胎换骨:Win11Debloat全面系统优化指南
3分钟让Windows 11脱胎换骨:Win11Debloat全面系统优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
决策树剪枝实战:用C++和Python分别实现,我踩过的坑你别再踩了
决策树剪枝实战:用C和Python分别实现,我踩过的坑你别再踩了 第一次在C里实现决策树剪枝时,内存泄漏让我调试到凌晨三点;而用Python重写时,又因为没注意NumPy的广播机制导致准确率计算全错。这篇文章记录了我从零实现两…...
BeanUtils vs MapStruct:Java对象拷贝工具选型指南(附性能对比测试)
BeanUtils vs MapStruct:Java对象拷贝工具深度评测与选型指南 在Java开发中,对象属性拷贝是几乎每个项目都会遇到的常见需求。从简单的DTO转换到复杂的领域模型映射,选择高效、稳定的拷贝工具直接影响代码质量和系统性能。本文将深入对比Apac…...
OpenCV实战:从相机响应函数(CRF)到HDR图像合成的完整流程解析
1. 相机响应函数(CRF)基础解析 第一次听说相机响应函数(CRF)时,我也是一头雾水。简单来说,CRF就是描述相机如何把真实世界的光线强度(L)转换成图像像素值(B)的数学关系。想象一下,你拿着手机对着同一个场景拍三张照片:一张很暗、一…...
VideoSrt:智能字幕生成工具重新定义视频创作效率
VideoSrt:智能字幕生成工具重新定义视频创作效率 【免费下载链接】video-srt-windows 这是一个可以识别视频语音自动生成字幕SRT文件的开源 Windows-GUI 软件工具。 项目地址: https://gitcode.com/gh_mirrors/vi/video-srt-windows VideoSrt是一款基于Golan…...

