07-appium常用操作

news2024/10/23 2:50:11

一、press_keycode

1)方法说明

        press_keycode方法是appium的键盘相关函数,可以实现键盘的相关操作,比如返回、按键、音量调节等等。也可以使用keyevent方法,功能与press_keycode方法类似。

# KeyCode:各种操作对应的键值码
driver.press_keycode(KeyCode)
2)使用示例
# 返回键
driver.press_keycode(4)

# 回车键
driver.press_keycode(66)

# 回车键
driver.keyevent(66)

# 退格键
driver.keyevent(67)

二、scroll方法

1)方法说明

        scroll方法是滑动页面,不过不是滑动滚动条,而是获取两个元素,然后从一个元素滚动到另一个元素。

        要求:两个元素都在界面上可见,否则会报错。而且滑动持续时间设置越短,滑动越快,滑动效果会不太准确。所以使用scroll方法时,滑动持续时间尽量设置大一些。

# origin_el:滚动的起始元素
# destination_el:滚动的结束元素
# duration:滑动的持续时间,默认是600ms,时间越大滑动越慢
driver.scroll(origin_el, destination_el, duration)
2)使用示例

        这里通过代码,将设置页从 “应用兼容性” 滑动到 “更多”。

start_element = driver.find_element('xpath', "//*[@text='应用兼容性']")
end_element = driver.find_element('xpath', "//*[@text='更多']")
driver.scroll(start_element, end_element, 5000)

三、drag_and_drop方法

1)方法说明

        drag_and_drop方法是也是滑动页面,从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置。

        要求:两个元素都在界面上可见,否则会报错。但是drag_and_drop方法不能设置滑动持续时间,但滑动效果比scroll方法更加精确,几乎没有惯性。drag_and_drop方法有点类似于慢速版的scroll方法。

# origin_el:滚动的起始元素
# destination_el:滚动的结束元素
driver.drag_and_drop(origin_el, destination_el)
2)使用示例

        这里通过代码,将设置页从 “应用兼容性” 滑动到 “更多”

start_element = driver.find_element('xpath', "//*[@text='应用兼容性']")
end_element = driver.find_element('xpath', "//*[@text='更多']")
driver.drag_and_drop(start_element, end_element)

四、swipe方法

1)方法说明

        swipe方法是从一个坐标点滑动到另一个坐标点,也就是说是两点之间的滑动。

# start_x:起始坐标点的横坐标
# start_y:起始坐标点的纵坐标
# end_x:结束坐标点的横坐标
# end_y:结束坐标点的纵坐标
# duration:滑动的持续时间
driver.swipe(start_x, start_y, end_x, end_y, duration)
2)使用示例

        这里通过代码,将设置页从第一个坐标点(660,1483)滑动到第二个坐标点(660,533)。

driver.swipe(660, 1483, 660, 533, 5000)

五、TouchAction

1)TouchAction使用步骤

        TouchAction可以实现一些针对手势的操作,比如滑动、拖动、长按等,我们可以将这些基本手势组合成一个相对复杂的手势,比如我们解锁手机或者一些应用软件都有手势解锁的这种方式。

  1. 使用TouchAction具体方法之前,需要导入TouchAction库。
    from appium.webdriver.common.touch_action import TouchAction
  2. 创建TouchAction对象。
  3. 通过对象调用想要执行的手势操作的方法。
  4. 通过perform方法执行动作(所有手势必须通过perform方法来触发)。
2)tap方法

        tap()方法用来模拟手指对某个元素或坐标按下并快速抬起。

        tap和click方法的作用差不多,但tap可以接收一个坐标值作为点击的区域,而click只能接收元素对象作为参数。另外,tap()方法还可以设置count参数,表示点击次数,count=2用来表示双击。

def tap(
    self,
    element: Optional['WebElement'] = None,
    x: Optional[int] = None,
    y: Optional[int] = None,
    count: int = 1,
) -> 'TouchAction':

"""Perform a tap action on the element

Args:
    element: the element to tap
    x : x coordinate to tap, relative to the top left corner of the element.
    y : y coordinate. If y is used, x must also be set, and vice versa
TouchAction(driver).tap(user_name).perform()
3)press方法

        press()方法用来模拟手指对某个元素或坐标一直按下。

def press(
    self,
    el: Optional['WebElement'] = None,
    x: Optional[int] = None,
    y: Optional[int] = None,
    pressure: Optional[float] = None,
) -> 'TouchAction':

"""Begin a chain with a press down action at a particular element or point

Args:
    el: the element to press
    x: x coordiate to press. If y is used, x must also be set
    y: y coordiate to press. If x is used, y must also be set
TouchAction(driver).press(x=100, y=200).perform()
4)release方法

        release()方法用来模拟手指抬起。

def release(self) -> 'TouchAction':

"""End the action by lifting the pointer off the screen
Returns:
    `TouchAction`: Self instance
"""
    self._add_action('release', {})
    return self
TouchAction(driver).press(x=100, y=200).release().perform()
5)wait方法

        wait()方法用来模拟手指等待。

 def wait(self, ms: int = 0) -> 'TouchAction':

"""Pause for `ms` milliseconds.
Args:
    ms: The time to pause

Returns:
    `TouchAction`: Self instance
"""
TouchAction(driver).press(x=100, y=200).wait(3000).release().perform()
6)move_to方法

        wait()方法用来模拟手指移动到某个元素或坐标。

def move_to(
    self, el: Optional['WebElement'] = None, x: Optional[int] = None, y: Optional[int] = None
) -> 'TouchAction':

"""Move the pointer from the previous point to the element or point specified
Args:
    el: the element to be moved to
    x: x coordiate to be moved to. If y is used, x must also be set
    y: y coordiate to be moved to. If x is used, y must also be set

Returns:
    `TouchAction`: Self instance
"""
TouchAction(driver).press(x=400, y=500).move_to(500, 600).perform()
7)使用示例

        通过代码绘制出下图中的图案。

8)报错分析
from appium import webdriver
import time

# 设置启动参数
desired_cap = {}
desired_cap['platformName'] = 'Android'
desired_cap['platformVersion'] = '6.0.1'
desired_cap['deviceName'] = '127.0.0.1:7555'
# 必须参数,指定被测软件的包名
desired_cap['appPackage'] = 'com.android.settings'
# 必须参数,指定要打开app的哪个页面
desired_cap['appActivity'] = '.ChooseLockPattern'
desired_cap['automationName'] = 'Uiautomator2'
desired_cap['noReset'] = True
desired_cap['newCommandTimeout'] = 6000
desired_cap['unicodeKeyboard'] = True
desired_cap['resetKeyboard'] = True

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_cap)

        通过adb命令获取到绘制图案页面的activity为.ChooseLockPattern,但是通过执行上面代码不能打开设置app,报错:Original error: Cannot start the 'com.android.settings' application. Original error: The permission to start '.ChooseLockPattern' activity has been denied.

        原因是app应用没开权限,对于activity是禁止外部调用的。

9)解决办法
  1. 将AndroidManifest.xml文件中将Activity设置成允许调用:Android:exported=”true”,加上权限后再重新打apk包。
  2. 通过代码打开app应用的启动页,然后通过定位菜单元素,逐层点击进入下一层界面,直到打开绘制图案界面为止。
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time

# 设置启动参数
desired_cap = {}
desired_cap['platformName'] = 'Android'
desired_cap['platformVersion'] = '6.0.1'
desired_cap['deviceName'] = '127.0.0.1:7555'
# 必须参数,指定被测软件的包名
desired_cap['appPackage'] = 'com.android.settings'
# 必须参数,指定要打开app的哪个页面
desired_cap['appActivity'] = '.Settings'
desired_cap['automationName'] = 'Uiautomator2'
desired_cap['noReset'] = True
desired_cap['newCommandTimeout'] = 6000
desired_cap['unicodeKeyboard'] = True
desired_cap['resetKeyboard'] = True

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_cap)
time.sleep(5)

# 1.获取手机设备宽、高信息
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']

# 2.将设置app的启动界面向上滑动半屏,使 “安全” 菜单项可见
driver.swipe(x * 0.5, y * 0.5, x * 0.5, 0)

# 3.依次点击菜单 “安全” -> “屏幕锁定方式” -> “图案”
driver.find_element('xpath', '//*[@text="安全"]').click()
time.sleep(1)
driver.find_element('xpath', '//*[@text="屏幕锁定方式"]').click()
time.sleep(1)
driver.find_element('xpath', '//*[@text="图案"]').click()
time.sleep(1)

# 4.绘制图案
ta = TouchAction(driver)
# 按住第一个点
ta.press(x=145, y=564).wait(1000)
ta.move_to(x=449, y=564).wait(1000)
ta.move_to(x=748, y=564).wait(1000)
ta.move_to(x=748, y=863).wait(1000)
ta.move_to(x=748, y=1165).wait(1000)
# 移动到最后一个点之后松手
ta.release().perform()
10)如何定位不可见元素?

        在上述示例中,打开app应用的启动页后,需要先打开 “安全” 菜单,但界面菜单项过多,屏幕太小,导致 “安全” 菜单不可见。所以需要先将屏幕进行滑动,使得 “安全” 菜单可见后,再进行操作。

        在上述示例中,将屏幕向上滑动半屏后,就能看见 “安全” 菜单,所以在代码中将滑动屏幕操作直接写死了,直接滑动半屏,然后进行定位、操作等等。

        但有时候要定位的元素,可能需要滑动好多屏才能看见,所以不能直接在代码中写死,而应该在while循环中边滑动屏幕、边对元素进行定位,当定位到目标元素后,跳出循环。

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

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

相关文章

MEMS六轴陀螺仪工作原理介绍

MEMS(微机电系统)六轴陀螺仪主要包括三轴陀螺仪和三轴加速度计,以下是其工作原理的简要介绍: 三轴陀螺仪工作原理: 陀螺仪利用科里奥利力原理来测量角速度。它通常有一个可振动的质量…

Zookeeper基础教程

Zookeeper基础教程 资料来源:Zookeeper Tutorial (tutorialspoint.com) zookeeper就是Hadoop生态动物园的管理员 1. Zookeeper-概述 ZooKeeper是一种分布式协调服务,用于管理大型主机集群(large set of hosts)。在分布式环境中协调和管理服务是一个复…

Java实现俄罗斯方块-初始化游戏界面的JPanel

目录 技术实现: 2.初始化游戏界面; 2.1 什么是游戏界面 2.2 JPanel面板 2.3 流布局管理器【FlowLayout】 2.4 网络布局管理器 【GridLayout】 2.5 边界布局管理器 技术实现: 1.初始化游戏窗口; 2.初始化游戏界面&#xff…

解决navicat连接oracle19c数据库缺少oci.dll

下载oci.dll文件 搜索Oracle Instant Client Downloads Oracle Instant Client Downloads点击 Oracle Instant Client Downloads 超链接 根据自己的操作系统按需选择 以windows64位为例,下载 Version 19.23.0.0.0的OCI压缩包 解压到Navicat的安装根路径下&#xff…

基于SpringBoot校园食堂订餐管理系统

文章目录 系统运行图概要整体架构流程技术名词解释 系统运行图 概要 随着校园人口的增加和生活节奏的加快,校园食堂的订餐管理面临着诸多挑战,传统的人工点餐方式已经不能满足日益增长的需求和期望。因此,本论文旨在设计和实现一种基于Java的…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十四)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 22 节) P22《21.ArkUI-实现摇杆功能》 本节我们将小鱼动画案例中的按钮控制改为摇杆控制,用来熟悉和巩固…

面向AI时代的软件开发新范式

作为一名软件开发者,有幸站在了AI时代的风口浪尖。在这篇博客中,我将分享我的个人看法,一起走向AI时代软件开发新范式。 首先,我们要明确软件开发活动产生的各种制品,都是人类知识的载体,也是人类文明的高级…

校园疫情防控健康打卡系统

摘 要 自疫情出现以来,全世界人民的生命安全和健康都面临着严重威胁。高校是我国培养人才的重要基地,其安全和稳定影响着社会的发展和进步。因此,各高校高度重视疫情防控工作,并在校园疫情防控中引入了健康打卡系统。本论文主要研…

Cookie-SameSite属性 前端请求不带cookie的问题解决方案

最近遇到了前端请求后端不带cookie的问题, 请求时header里面就是没有cookie 查看响应应该是这个问题 SameSite是一个cookie属性,用于控制浏览器是否在跨站点请求中发送cookie。它有三个可能的值: 1. Strict(严格模式&#xff09…

如何使用pwclient从社区邮件列表获取相关补丁

最近在调试Qualcomm的QCA2066 WiFi 6E平台,主控处理器信息如下所示: 6nm AMD APU CPU:Zen 2 4c/8t、2.4-3.5GHz(最高可达 448GFlops FP32) GPU:8 RDNA 2 CUs、1.6GHz(1.6 TFlops FP32&#xff0…

Tomcat配置详解

文章目录 一、配置文件介绍配置文件日志文件 二、组件组件分层和分类核心组件Tomcat处理请求过程URL对应关系 三、部署java程序手动部署搭建博客状态页 四、常见配置详解tomcat端口号安全配置管理虚拟主机配置Context配置 四、Tomcat Nginx动静分离 一、配置文件介绍 配置好环…

代码讲解——ssm+jsp+maven项目目录结构说明

1 applicationContext.xml 应用上下文配置 2 db.properties 数据库配置 3 log4j.properties日志配置 4 mybatis-config.xml mybatis配置 5 springmvc.xml springmvc配置

【ai】tx2-nx:安装深度学习环境及4.6对应pytorch

参考:https://www.waveshare.net/wiki/Jetson_TX2_NX#AI.E5.85.A5.E9.97.A8 英伟达2021年发布的的tritionserver 2.17 版本中,backend 有tensorflow1 和 onnxruntime ,他们都是做什么用的,作为backend 对于 triton 推理server意义是什么,是否应该有pytorch? Triton Infer…

新版二开微信发卡小程序源码卡密系统/支持流量主

新版二开微信发卡小程序源码卡密系统支持流量主。裂变扩展多种领取模式二次开发的发卡小程序源码,其后台采用PHP编写,支持用户通过付费购卡或者观看视频广告领取卡密。 该小程序还支持流量主,因为功能需要,就进行了二开&#xff…

LeetCode 热题100 --哈希

哈希 哈希,有限空间映射一个无限的空间。在空间内,有序化进行快速查询。 用空间换时间。 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组…

如何使用ChatGPT辅助设计工作

文章目录 设计师如何使用ChatGPT提升工作效率?25个案例告诉你!什么是 prompt?咨询信息型 prompt vs 执行任务 prompt编写出色 prompt 的基本思路撰写 prompt 的案例和技巧1、将 ChatGPT 视作专业人士2、使用 ChatGPT 创建表单3、使用 ChatGPT…

论文学习 Learning Robust Representations via Multi-View Information Bottleneck

Code available at https://github.com/mfederici/Multi-View-Information-Bottleneck 摘要:信息瓶颈原理为表示学习提供了一种信息论方法,通过训练编码器保留与预测标签相关的所有信息,同时最小化表示中其他多余信息的数量。然而&#xff0…

驶向未来,智慧加油新体验——我们的加油App开发之旅

一、引言 在数字化与智能化交织的时代,每一次出行都呼唤着更加高效、便捷的服务。为了满足广大车主对加油服务的更高需求,我们倾力打造了一款创新的加油App,旨在为您的驾驶生活带来前所未有的智慧新体验。 二、洞察需求,创新服务…

torch.optim 之 Algorithms (Implementation: for-loop, foreach, fused)

torch.optim的官方文档 官方文档中文版 一、Implementation torch.optim的官方文档在介绍一些optimizer Algorithms时提及它们的implementation共有如下三个类别:for-loop, foreach (multi-tensor), and fused。 Chat-GPT对这三个implementation的解释是&#xf…

光伏设计需要设计哪些方面?

光伏设计是一项复杂而关键的工作,它涉及到多个方面的综合考虑,以确保光伏系统的效率、安全性和可持续性。下面将详细探讨光伏设计需要设计的几个方面。 一、系统规模与布局 光伏设计的首要任务是确定系统的规模和布局。这包括评估安装地点的光照资源、可…