『App自动化测试之Appium应用篇』| Appium常用API及操作
『App自动化测试之Appium应用篇』| Appium常用API及操作
- 1 press_keycode
- 1.1 键盘操作
- 1.2 关于KeyCode
- 1.3 press_keycode源码
- 1.4 电话键相关
- 1.5 控制键相关
- 1.6 基本按键相关
- 1.7 组合键相关
- 1.8 符号键相关
- 1.9 使用举例
- 2 swip方法
- 2.1 swip说明
- 2.2 swip使用方法
- 2.3 使用示例
- 3 scroll方法
- 4 drag_and_drop方法
- 5 TouchAction方法
- 5.1 tap方法
- 5.2 press方法
- 5.3 release方法
- 5.4 wait方法
- 5.5 move_to方法
1 press_keycode
1.1 键盘操作
press_keycode
是Appium
的键盘相关函数;- 可以实现键盘的相关操作,比如返回、按键、音量调节等等;
- 函数使用方法为:
driver.press_keycode(KeyCode)
1.2 关于KeyCode
- 以上
press_keycode
方法中传入参数KeyCode
,而KeyCode
是对应的键值码; - 其可以传入对应的键值名,也可以传入具体键值名的值(对应数字)。
1.3 press_keycode源码
press_keycode
源码如下:
def press_keycode(self, keycode: int, metastate: Optional[int] = None, flags: Optional[int] = None) -> 'WebDriver':"""Sends a keycode to the device.Android only. Possible keycodes can be foundin http://developer.android.com/reference/android/view/KeyEvent.html.Args:keycode: the keycode to be sent to the devicemetastate: meta information about the keycode being sentflags: the set of key event flagsReturns:Union['WebDriver', 'Keyboard']: Self instance"""ext_name = 'mobile: pressKey'args = {'keycode': keycode}if metastate is not None:args['metastate'] = metastateif flags is not None:args['flags'] = flagstry:self.assert_extension_exists(ext_name).execute_script(ext_name, args)except UnknownMethodException:# TODO: Remove the fallbackself.mark_extension_absence(ext_name).execute(Command.PRESS_KEYCODE, args)return cast('WebDriver', self)
- 从源码中可以看出,想要找到对应的键值名可以直接去官网查看。
1.4 电话键相关
- 以下为部分(非全部,仅参考)电话键相关键值名:
键值名 | 说明 | 键值 |
---|---|---|
KEYCODE_HOME | HOME 键 | 3 |
KEYCODE_BACK | 返回键 | 4 |
KEYCODE_CALL | 拨号键 | 5 |
KEYCODE_EKDCALL | 挂机键 | 6 |
KEYCODE_VOLUME_UP | 音量增加键 | 24 |
KEYCODE_VOLUME_DOWN | 音量减减键 | 25 |
KEYCODE_POWER | 电源键 | 26 |
KEYCODE_CAMERA | 拍照键 | 27 |
KEYCODE_MENU | 菜单键 | 82 |
KEYCODE_NOTIFICATION | 通知键 | 83 |
KEYCODE_SEARCH | 搜索键 | 84 |
1.5 控制键相关
- 以下为部分(非全部,仅参考)控制键相关键值名:
键值名 | 说明 | 键值 |
---|---|---|
KEYCODE_DPAD_UP | 导航键 向上 | 19 |
KEYCODE_DPAD_DOWN | 导航键 向下 | 20 |
KEYCODE_DPAD_LEFT | 导航键 向左 | 21 |
KEYCODE_DPAD_RIGHT | 导航键 向右 | 22 |
KEYCODE_DPAD_CENTER | 导航键 确定键 | 23 |
KEYCODE_TAB | TAB 键 | 61 |
KEYCODE_ENTER | 回车键 | 66 |
KEYCODE_DEL | 退格键 | 67 |
KEYCODE_ESCAPE | ESC 键 | 111 |
KEYCODE_FORWARD_DEL | 删除键 | 112 |
KEYCODE_CAPS_LOCK | 大写锁定键 | 115 |
KEYCODE_SCROLL_LOCK | 滚动锁定键 | 116 |
1.6 基本按键相关
- 以下为部分(非全部,仅参考)基本按键相关键值名:
- 其中按键0-9键值为7-16,比如:
键值名 | 说明 | 键值 |
---|---|---|
KEYCODE_0 | 按键’0’ | 7 |
KEYCODE_1 | 按键’1’ | 8 |
KEYCODE_2 | 按键’2’ | 9 |
- 其中字母A-Z的键值为29-54,比如:
键值名 | 说明 | 键值 |
---|---|---|
KEYCODE_A | 按键’A’ | 29 |
KEYCODE_B | 按键’B’ | 30 |
KEYCODE_C | 按键’C’ | 31 |
1.7 组合键相关
- 以下为部分(非全部,仅参考)组合键相关键值名:
键值名 | 说明 |
---|---|
KEYCODE_ALT_LEFT | ALT+LIFT |
KEYCODE_ALEERT_RIGHT | ALT_RIGHT |
KEYCODE_CTRL_LEFT | Ctrl_lEFT |
KEYCODE_CTRL_RIGHT | Ctrl_RIGHT |
KEYCODE_SHIFT_LEFT | Shift+lEFT |
KEYCODE_SHIFT_RIGHT | Shift+RIGHT |
1.8 符号键相关
- 以下为部分(非全部,仅参考)符号键相关键值名:
键值名 | 说明 |
---|---|
KEYCODE_PLUS | 按键’+’ |
KEYCODE_MINUS | 按键’-’ |
KEYCODE_STAR | 按键’*’ |
KEYCODE_SLASH | 按键’/’ |
KEYCODE_EQUALS | 按键’=’ |
KEYCODE_AT | 按键’@’ |
KEYCODE_POUND | 按键’#’ |
KEYCODE_SPACE | 空格键 |
1.9 使用举例
- 使用方法为:
driver.press_keycode(4) # 返回键
driver.press_keycode(84) # 搜索键
- 或者可以使用
keyevent
方法:
driver.keyevent(66) # 回车键
driver.keyevent(67) # 退格键
2 swip方法
2.1 swip说明
swip()
方法是从一个坐标位置滑动到另一个坐标位置;- 也就是说两点之间的滑动。
2.2 swip使用方法
- 可以查看
swip
源码来看下如何使用:
def swipe(self, start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0) -> 'WebDriver':"""Swipe from one point to another point, for an optional duration.Args:start_x: x-coordinate at which to startstart_y: y-coordinate at which to startend_x: x-coordinate at which to stopend_y: y-coordinate at which to stopduration: defines the swipe speed as time taken to swipe from point a to point b, in ms.Usage:driver.swipe(100, 100, 100, 400)Returns:Union['WebDriver', 'ActionHelpers']: Self instance"""touch_input = PointerInput(interaction.POINTER_TOUCH, "touch")actions = ActionChains(self)actions.w3c_actions = ActionBuilder(self, mouse=touch_input)actions.w3c_actions.pointer_action.move_to_location(start_x, start_y)actions.w3c_actions.pointer_action.pointer_down()if duration > 0:actions.w3c_actions = ActionBuilder(self, mouse=touch_input, duration=duration)actions.w3c_actions.pointer_action.move_to_location(end_x, end_y)actions.w3c_actions.pointer_action.release()actions.perform()return cast('WebDriver', self)
- 从以上看需要至少四个参数
swipe(self, start_x: int, start_y: int, end_x: int, end_y: int)
;
2.3 使用示例
- 比如坐标从(100,200)滑动到(300,400):
driver.swipe(100, 200, 300, 400)
- 再比如从(400,500)滑动到(600,700)持续3秒:
driver.swipe(400, 500, 600, 700, 3000)
3 scroll方法
scroll()
方法是从一个元素滑动到另一个元素,直到页面自动停止;- 使用方法为:
def scroll(self, origin_el: WebElement, destination_el: WebElement, duration: Optional[int] = None) -> 'WebDriver':"""Scrolls from one element to anotherArgs:origin_el: the element from which to begin scrolling (center of element)destination_el: the element to scroll to (center of element)duration: defines speed of scroll action when moving from originalEl to destinationEl.Default is 600 ms for W3C spec.Usage:driver.scroll(el1, el2)
- 比如从用户名滑动到密码输入框:
user_name = driver.find_element(AppiumBy.XPATH, "//*[@text='用户名']")
user_passwd = driver.find_element(AppiumBy.XPATH, "//*[@text='密码']")
driver.scroll(user_name, user_passwd)
4 drag_and_drop方法
drag_and_drop()
方法从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置;- 使用方法为:
def drag_and_drop(self, origin_el: WebElement, destination_el: WebElement) -> 'WebDriver':"""Drag the origin element to the destination elementArgs:origin_el: the element to dragdestination_el: the element to drag toReturns:Union['WebDriver', 'ActionHelpers']: Self instance"""
- 比如:
user_name = driver.find_element(AppiumBy.XPATH, "//*[@text='用户名']")
user_passwd = driver.find_element(AppiumBy.XPATH, "//*[@text='密码']")
driver.drag_and_drop(user_name, user_passwd)
5 TouchAction方法
TouchAction
可实现手势的操作,比如滑动、拖动、长按等操作;- 使用方法是先需要导入
TouchAction
:
from appium.webdriver.common.touch_action import TouchAction
5.1 tap方法
tap()
方法模拟手指对某个元素或坐标按下并快速抬起;- 使用方法为:
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 elementArgs:element: the element to tapx : 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()
5.2 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 pointArgs:el: the element to pressx: x coordiate to press. If y is used, x must also be sety: y coordiate to press. If x is used, y must also be set
- 比如:
TouchAction(driver).press(x=100, y=200).perform()
5.3 release方法
release()
方法是模拟手指抬起;- 使用方法:
def release(self) -> 'TouchAction':"""End the action by lifting the pointer off the screenReturns:`TouchAction`: Self instance"""self._add_action('release', {})return self
- 比如:
TouchAction(driver).press(x=100, y=200).release().perform()
5.4 wait方法
wait()
方法是模拟手指等待;- 使用方法为:
def wait(self, ms: int = 0) -> 'TouchAction':"""Pause for `ms` milliseconds.Args:ms: The time to pauseReturns:`TouchAction`: Self instance"""
- 比如按下等待3秒后抬起:
TouchAction(driver).press(x=100, y=200).wait(3000).release().perform()
5.5 move_to方法
move_to()
方法是模拟手指移动;- 使用方法:
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 specifiedArgs:el: the element to be moved tox: x coordiate to be moved to. If y is used, x must also be sety: y coordiate to be moved to. If x is used, y must also be setReturns:`TouchAction`: Self instance"""
- 比如:
TouchAction(driver).press(x=400, y=500).move_to(500, 600).perform()
相关文章:
『App自动化测试之Appium应用篇』| Appium常用API及操作
『App自动化测试之Appium应用篇』| Appium常用API及操作 1 press_keycode1.1 键盘操作1.2 关于KeyCode1.3 press_keycode源码1.4 电话键相关1.5 控制键相关1.6 基本按键相关1.7 组合键相关1.8 符号键相关1.9 使用举例 2 swip方法2.1 swip说明2.2 swip使用方法2.3 使用示例 3 sc…...
VSCode搭建 .netcore 开发环境
一、MacOS 笔者笔记本电脑上安装的是macOS High Sierra(10.13),想要尝试一下新版本的.netcore,之前系统是10.12时,.netcore 3.1刚出来时安装过3.1版本,很久没更新了,最近.net8出来了,想试一下,…...
python 写自动点击爬取数据
今天来点不一样的!哥们 提示: 这里只是用于自己学习的 ,请勿用违法地方 效果图 会进行点击下一页 进行抓取 需要其他操作也可以自己写 文章目录 今天来点不一样的!哥们前言一、上代码?总结 前言 爬虫是指通过编程自动…...
CSDN博客重新更新
说来惭愧,好久没更新博客文章,导致个人博客网站:https://lenky.info/ 所在的网络空间和域名都过期了都没发觉,直到有个同事在Dim上问我我的个人博客为啥打不开了。。。幸好之前有做整站备份,后续慢慢把内容都迁回CSDN上…...
《剑指 Offer》专项突破版 - 面试题 5 : 单词长度的最大乘积(C++ 实现)
目录 前言 方法一 方法二 前言 题目链接:318. 最大单词长度乘积 - 力扣(LeetCode) 题目: 输入一个字符串数组 words,请计算不包含相同字符的两个字符串 words[i] 和 words[j] 的长度乘积的最大值。如果所有字符串…...
【Java集合篇】HashMap的get方法是如何实现的?
HashMap的get方法是如何实现的 ✔️典型解析✔️拓展知识仓✔️如何避免HashMap get方法的哈希重✔️HashMap get方法的优缺点有哪些✔️HashMap get方法的是线程安全的吗✔️什么是ConcurrentHashMap✔️ConcurrentHashMap有哪些应用场景✔️ConcurrentHashMap的优缺点 ✔️源…...
Java学习苦旅(二十二)——MapSet
本篇博客将详细讲解Map和Set。 文章目录 搜索概念模型 MapMap.Entry<K, V>Map的常用方法说明TreeMap和HashMap的区别 Set常用方法说明TreeSet和HashSet的区别 结尾 搜索 概念 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例…...
【Linux Shell】12. 文件包含
和其他语言一样,Shell 也可以包含外部脚本,这样可以很方便的封装一些公用的代码作为一个独立的文件。可以理解为在第2个文件中包含第1个文件,执行第1个文件的代码。 被包含的文件 不需要可执行权限 。Shell 文件包含的语法格式如下࿱…...
前端-基础 常用标签-超链接标签( 锚点链接 )
锚点链接 : 点击链接,可以快速定位到 页面中的某个位置 如果不好理解,讲一个例子,您就马上明白了 >>> 这个是 刘德华的百度百科 ,可以看到,页面里面有很多内容,那就得有个目录了 …...
2024--Django平台开发-基础信息(一)
一、前置知识点 - Python环境搭建 (Python解释器、Pycharm、环境变量等) - 基础语法(条件、循环、输入输出、编码等) - 数据类型(整型、布尔型、字符串、列表、字典、元组、集合等) - 函数(文件操作、返回值、参数、作用域等) - 面向对象 (类、对象、封装、继承、多态等)包和模…...
C++力扣题目--94,144,145二叉树递归遍历
思路 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是“一看就会,一写就废”。 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都靠运气。 本篇将介绍前后…...
开源游戏引擎:创造无限可能 | 开源专题 No.56
godotengine/godot Stars: 62.6k License: MIT Godot Engine 是一个功能强大的跨平台游戏引擎,可用于创建 2D 和 3D 游戏。它提供了一套全面的常见工具,让用户可以专注于制作游戏而不必重复造轮子。该引擎支持将游戏一键导出到多个平台上,包…...
MyBatisPlus学习一:快速入门
前言 前面快速学习了Mybatis,现在开始快速学习MyBatisPlus 学习教程: 黑马mybatis教程全套视频教程,2天Mybatis框架从入门到精通 黑马程序员最新MybatisPlus全套视频教程,4小时快速精通mybatis-plus框架 简介 MyBatisPlus 是…...
2024最新外贸建站:ChemiCloud主机购买使用及自建外贸独立站教程
随着电商平台竞争的加剧,许多外贸从业者意识到减少对平台依赖的重要性,并选择搭建自己的外贸独立站来获得更多的控制权和灵活性。即使是没有建站基础的新手,也可以通过学习建站来实现这一目标。下面是一个适用于新手的外贸建站教程࿰…...
校招社招,认知能力测验,③如何破解语言常识类测试题?
作为认知能力测评中的一个环节,语言常识类,是大概率的出现,不同的用人单位可能略有不同,语言是一切的基础,而常识则意味着我们的知识面的宽度。 语言常识类的测试,如果要说技巧?难说....更多的…...
了解一下InternLM2
大模型的出现和发展得益于增长的数据量、计算能力的提升以及算法优化等因素。这些模型在各种任务中展现出惊人的性能,比如自然语言处理、计算机视觉、语音识别等。这种模型通常采用深度神经网络结构,如 Transformer、BERT、GPT( Generative P…...
关于使用统一服务器,vscode和网页版jupyter notebook的交互问题
autodl 查看虚拟环境 在antodl上租借了一个服务器,通过在网页上运行jupyter notebook和在vscode中运行,发现环境都默认的是miniconda3。 conda info --envs 当然环境中所有的包都是一样的。 要查看当前虚拟环境中安装的所有包,可以使用以…...
Linux22.04系统安装显卡驱动,cuda,cudnn流程
1. 安装显卡驱动 ubuntu-drivers deices显示所有适配显卡的驱动型号,recommended为推荐安装 安装 sudo apt install nvidia-driver-440重启 sudo reboot验证 nvidia-smi2. 安装cuda 在 CUDA Toolkit 的下载页面选择系统版本和安装方式,下载并运行…...
【常考简答题】操作系统
目录 1、什么是进程 2、创建进程步骤 3、什么是死锁 4、死锁四个必要条件 5、什么是内存管理 6、内存管理功能 7、进程的三个基本状态转化图 8、操作系统为什么引入线程 9、什么是对换技术,好处是什么 10、DMA直接存取控制工作方式流程图 11、什么是假脱…...
Large Language Models Paper 分享
论文1: ChatGPTs One-year Anniversary: Are Open-Source Large Language Models Catching up? 简介 2022年11月,OpenAI发布了ChatGPT,这一事件在AI社区甚至全世界引起了轰动。首次,一个基于应用的AI聊天机器人能够提供有帮助、…...
微信小程序实战-01翻页时钟-1
文章目录 前言需求分析功能设计界面设计界面结构设计界面样式设计 逻辑设计 单页功能实现运行结果 前言 我经常在手机上用的一款app有一个功能是翻页时钟,基于之前学习的小程序相关的基础内容,我打算在微信小程序中也设计一个翻页时钟功能,J…...
BigDecimal的性能问题
BigDecimal 是 Java 中用于精确计算的数字类,它可以处理任意精度的小数运算。由于其精确性和灵活性,BigDecimal 在某些场景下可能会带来性能问题。 BigDecimal的性能问题 BigDecimal的性能问题主要源于以下几点: 内存占用:BigDec…...
Defi安全-Monox攻击事件Foundry复现
其它相关内容可见个人主页 Mono攻击事件的介绍见:Defi安全–Monox攻击事件分析–phalconetherscan 1. 前情提要和思路介绍 Monox使用单边池模型,创建的是代币-vCash交易对,添加流动性时,只需添加代币,即可进行任意代…...
大二上总结和寒假计划
👂 Start Again - Connor Price/Chloe Sagum - 单曲 - 网易云音乐 👂 年年 - 徐秉龙 - 单曲 - 网易云音乐 目录 🌼前言 👊成长 (1)情感 (2)运动 (3)穿搭…...
使用 pdfh5 实现 pdf 预览功能
1. 安装 npm install pdfh5 2. 使用 html部分: <div id"showPdf" style"width: 100%;"></div> js部分: <script> //合同展示组件 import Pdfh5 from pdfh5 //合同组件样式 import pdfh5/css/pdfh5.css expo…...
HttpRunner辅助函数debugtalk.py
辅助函数debugtalk.py Httprunner框架中,使用yaml或json文件进行用例描述,无法做一些复杂操作,如保存一些数据跨文件调用,或者实现一些复杂逻辑判断等,为了解决这个问题,引入了debugtalk.py辅助函数来进行一…...
PC端扫描小程序二维码登录
1、获取二维码地址,通过请求微信开发者文档中的服务端获取无限制小程序二维码URL #controller层 import org.apache.commons.codec.binary.Base64;/*** 获取小程序二维码*/PassTokenGetMapping("/getQrCode")public AjaxResult getQrCode(BlogUserDto bl…...
计算机毕业设计 | SpringBoot+vue移动端音乐网站 音乐播放器(附源码)
1,项目背景 随着计算机技术的发展,网络技术对我们生活和工作显得越来越重要,特别是现在信息高度发达的今天,人们对最新信息的需求和发布迫切的需要及时性。为了满足不同人们对网络需求,各种特色,各种主题的…...
Flutter 中的 Stream:异步编程的利器
在Flutter中,异步编程是非常重要的一部分,特别是在处理用户输入、网络请求或其他涉及时间的操作时。Flutter提供了一种强大的工具,称为Stream,用于简化异步编程的过程。 什么是 Stream? Stream是一种用于处理异步数据…...
2023 波卡年度报告选读:Polkadot SDK 与开发者社区
原文:https://dashboards.data.paritytech.io/reports/2023/index.html#section6 编译:OneBlock 编者注:Parity 数据团队发布的 2023 年 Polkadot 年度数据报告,对推动生态系统的关键数据进行了深入分析。报告全文较长ÿ…...
wordpress4.9博客模板/站长工具网址是多少
关于直线直线方程点到直线的距离用两点表示的直线2d隐式表示的直线的情形参数方程表示的直线一个点到射线或线段的距离代码实现距离计算是计算机图形学和计算几何的基本问题,而且有很多关于这方面的公式。不过,由于对象描述方式不同,有替代方…...
阿里巴巴网站建设与维护/无锡做网站的公司
写在前面 假设你明白清晰知道需求规格说明书是什么。则能够忽略此文章。假设你不清晰。建议还是阅读一下本文,不然或许早晚会碰钉子。转载请标明出处: http://blog.csdn.net/ouyida3/article/details/47683191 本文出自:【ouyida3的博客】 起因 近期在做…...
自己如何建设网站/宁波正规优化seo价格
C编译器生成的默认函数话题引入: 对象的赋值与复制是如何进行的?他们的区别是什么?如果一个空的自定义类型能否执行这些操作? 对象赋值:通过“ ”运算符重载 User a(10),b; b a; 对象复制:调用拷贝构造函…...
厦门网站建设哪家不错/排名优化工具
Linux操作系统知识 1. Linux开机启动流程详细步骤是什么?忘记密码如何破解? 2. 企业中Linux数据库服务器做raid几,你们原来公司的数据库服务器大小?RAID 0 1 5 10区别,系统分区标准是什么? 3. 某一天突然…...
e时代网站制作/海淀搜索引擎优化seo
我正在尝试将CMU的二元炸弹作为一个独立项目来学习一些x86组装和逆向工程. (这不是与班级相关的自动评分版本.)来自CMU的实验室描述:A “binary bomb” is a program provided to students as an object codefile. When run,it prompts the user to type in 6 diffe…...
wordpress时光轴插件/网站seo源码
本文主要介绍无源电气网络,不涉及电动机和运算放大器,网络由RCL组成,复杂的电路包括恒流源和恒压源,用基尔霍夫定律列写KCL,KVL方程就能解决大部分问题。当然对这块考察深的考生可以复习一下节点电压法,戴维…...