技术分享 | app自动化测试(Android)--触屏操作自动化

news2024/11/22 16:43:09

导入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 TouchAction

class 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):
        # 点击 Views
        el1 = self.driver.find_element_by_accessibility_id(
            "Views")
        # 点击 Accessibility
        el2 = 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;

    @BeforeAll
    public 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);
    }

    @Test
    void 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 中的事件链顺序执行。

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

Python高级进阶(1)----深入理解Python迭代器与生成器

文章目录 1. 迭代器协议代码示例:2. 生成器基础代码示例:3. 使用yield的高级技巧代码示例:4. 生成器表达式代码示例:迭代器和生成器是Python中实现迭代的两种主要方式,它们都允许用户创建可以遍历数据集的对象。在Python中,迭代器协议是指对象需要遵守__iter__()和__next…

05【保姆级】-GO语言的标识符

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

Java开发注意事项和细节说明

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;Java开发注意事项和细节说明&…

项目部署之安装和配置Canal

1.Canal介绍 Canal是阿里巴巴的一个开源项目&#xff0c;基于java实现&#xff0c;整体已经在很多大型的互联网项目生产环境中使用&#xff0c;包括阿里、美团等都有广泛的应用&#xff0c;是一个非常成熟的数据库同步方案&#xff0c;基础的使用只需要进行简单的配置即可。 …

HelpLook VS HelpDocs:知识库工具一对一比较

您是否正在寻找比HelpDocs更好的替代方案&#xff1f;您是否希望使用功能更强大的类似工具&#xff1f;HelpDocs是一款简单易用的知识库软件&#xff0c;可以在一个集中的位置创建、托管和监控自助服务门户。凭借其模板、原生集成和详细的分析功能提供不错的用户体验。尽管它具…

我在Vscode学OpenCV 图像运算(权重、逻辑运算、掩码、位分解、数字水印)

文章目录 权重 _ 要求两幅图像是相同大小的。[ 1 ] 以数据说话&#xff08; 1&#xff09; 最终&#xff1a;&#xff08; 2 &#xff09;gamma _输出图像的标量值 [ 2 ] 图像的展现力gamma并不等同于增加曝光度&#xff08; 1 &#xff09;gamma100&#xff08; 2 &#xff09…

武器检测YOLOV8NANO

武器检测&#xff08;匕首&#xff0c;步枪&#xff0c;手枪&#xff09;&#xff0c;采用YOLOV8NANO训练&#xff0c;得到pt模型&#xff0c;然后转换成Onnx模型&#xff0c;供OPENCV DNN调用&#xff0c;支持C,PYTHON,ANDROID。有标注的训练集 武器检测YOLOV8NANO

04-react基础知识-路由

一、react路由环境安装 使用指令&#xff1a;npm i --save react-router-dom type/react-router-dom进行react路由环境安装 二、引入路由 在main.jsx文件中引入该语句&#xff1a; import { createBrowserRouter, RouterProvider } from react-router-dom 定义一个变量rou…

Socket 通信

文章目录 Socket 通信创建流程图通信示例对一些概念进行讲述对Socke 编程所用的函数进行讲解 网络通信 和 Socket Socket 通信流程图 &#xff1a; 通信示例 对Socket 编程有一个初步的了解, 看看具体代码是如何实现的. 示例的主要功能: 实现大小写的转化,客户端发送数据 …

传输线的阻抗和反射到底是什么关系?

传输线的阻抗和反射到底是什么关系? 传输线是通信系统中最基本的传输元件之一&#xff0c;它可以将信号从一个端点传输到另一个端点。然而&#xff0c;在实际的通信系统中&#xff0c;传输线往往面临着许多问题&#xff0c;其中最主要的两个问题是阻抗不匹配和信号反射。本文将…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…

linux的美化工具 oh-my-zsh的安装与使用 神器工具

目录 1 安装zsh的环境2 安装 Oh My Zsh3 主题设置重新启动终端:关闭连接 在重新链接一下附加 -插件管理案例讲解看效果 Oh My Zsh 是一款基于 Zsh 的开源命令行工具&#xff0c;它提供了丰富的主题和插件&#xff0c;可以帮助用户更加高效地使用终端。本文将详细介绍 Oh My Zsh…

【StringBuilder和StringBuffer】

文章目录 StringBuilder和StringBufferString类、StringBuilder和StringBuffer的区别 StringBuilder和StringBuffer的区别StringBuilder 字符串逆置 StringBuilder和StringBuffer String类、StringBuilder和StringBuffer的区别 String类的特点是不可变性&#xff0c;所以Stri…

Android项目升级到AndroidX

1、 2、 然后报错了&#xff1a; The gradle plugin version in your project build.gradle file needs to be set to at least com.android.tools.build:gradle:3.2.0 in order to migrate to AndroidX. 修改gradle版本 31报错了就用30.0.0了 3、 提示备份、然后执行do re…

软文发布如何选择对应的媒体

企业做软文推广第一步&#xff0c;就是选择合适的媒体进行投放&#xff0c;然而许多企业不知道如何选择合适的媒体导致推广工作十分被动&#xff0c;无法取得效果&#xff0c;今天媒介盒子就来和大家分享&#xff0c;企业应该如何选择对应的媒体。 一、 媒体类型 根据软文类型…

视频集中存储EasyCVR平台播放一段时间后出现黑屏是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

有关环境变量

什么是环境变量 用户变量仅对当前用户有效&#xff0c;系统变量对整个系统有效 环境变量就是一个字符串&#xff0c;为了方便修改给隔开了&#xff08;图形化界面&#xff09; 环境变量可以用来配置路径&#xff0c;也可以用来配置其他&#xff0c;比如图中的 NUMBER_OF_PROC…

医院陪诊小程序源码 医院陪诊陪护系统源码

医院陪诊小程序源码 医院陪诊陪护系统源码 陪诊系统小程序&#xff1a;提高陪诊效率&#xff0c;改善医疗服务体验 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;我们的生活中出现了越来越多的智能设备和智能应用&#xff0c;这些智能应用不仅极大方便了我们的生活…

数据仓库工具箱-零售业务

文章目录 一、维度模型设计的4步过程1.1 第一步&#xff1a;选择业务过程1.2 第二步&#xff1a;声明粒度1.3 第三步&#xff1a;确定维度1.4 第四步&#xff1a;确定事实 二、零售业务案例研究2.1 第一步&#xff1a;选择业务过程2.2 第二步&#xff1a;声明粒度2.3 第三步&am…

AI智能客服代替IVR

什么是IVR导航&#xff1f; “欢迎致电XXX客服热线 XXX请按1 XX服务请按2 重听请按3 人工服务请按0 返回请按*号键” 这个导航称为语音导航IVR。传统的电话通道系统通过电话上的按钮广播语音信息来通知客户或等待客户输入内容&#xff0c;然后根据客户的输入进行下一步的…