App爬虫之强大的Airtest的操作总结

App爬虫之强大的Airtest的操作总结

App爬虫之强大的Airtest的操作总结

# Python使用该框架需要安装的依赖库
pip install airtest
pip install poco
pip install pocoui
from airtest.core.api import *
from airtest.cli.parser import cli_setup
from poco.drivers.android.uiautomation import AndroidUiautomationPoco"""
自动配置运行环境, 如果没有连接设备, 默认连接安卓设备
参数:basedir - 设置当前脚本所在路径,也可以直接传_file_变量进来devices - 一个内容为connect_device url 字符串的列表logdir - 可设置脚本运行是log保存路径,默认值为None则不保存log,如果设置为True则自动保存在<basedir>/log目录中project_root - 用于设置PROJECT_ROOT变量,方便using接口调用
"""
if not cli_setup():auto_setup(__file__, logdir=True, devices=["android://127.0.0.1:5037/10.2.145.168:5555?cap_method=MINICAP&&ori_method=MINICAPORI&&touch_method=MAXTOUCH"])# 连接本机默认端口连的设备号为123和456的两台手机
# auto_setup(__file__,devices=["Android://127.0.0.1:5037/123","Androd://127.0.0.1:5037/456"])poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)# script content
print("start...")# 唤醒并解锁目标设备
wake()# 启动APP
start_app("com.bonade.xxp")# home键操作
# home()# 若是设置的APP开着,则关闭APP
# stop_app("com.bonade.xxp")# 安装待测软件apk,路径信息。
# install("path/to/your/apk")# 卸载安装
# uninstall("package_name_of_your_apk")

一、 定位方式

child:获取当前节点下的子节点,
如果是多个获取多个,用for循环获取,不使用循环提取的默认提取第一个节点

def child(self, name=None, **attrs): 

示例:

menuList1=poco("com.aa.bb:ide_bottom_navigator").child("android.widget.LinearLayout")
for i in range(0,len(menuList1)):  #同列表方式一致,节点序号从0开始print ("第 %d 次用child获取menuList底部全部菜单=====%s"%(i,menuList1[i]))

children:获取子节点
获取字节点,如果是多个获取多个,用for循环获取,不使用循环提取的默认提取第一个节点

def children(self): 

示例:

menuList2=poco("com.tencent.nbagametime:ide_bottom_navigator").child("android.widget.LinearLayout").children()
for i in range(0,len(menuList2)):print ("第 %d 次用children获取menuList底部菜单名=====%s"%(i,menuList2[i]))

offspring:孙节点
获取当前节点下的孙节点,如果是多个获取多个,用for循环获取,不使用循环提取的默认提取第一个节点

def offspring(self, name=None, **attrs): 

offspring查找孙节点的顺序:树结构自底往上,同一层从中间右边左边的顺序
sibling:兄弟节点
获取当前节点的兄弟节点

def sibling(self, name=None, **attrs):  

parent:父节点
获取当前节点的父节点,如果获取的当前节点是多个(用children获取的),则获取列表第一个节点的父节点

def parent(self): 

注意:此方法在Android上可用,在Ios上不可用,会报错:AttributeError: ‘UIObjectProxy’ object has no attribute ‘parent’ attr(‘type’):提取属性值
示例:

poco('ssion').attr('type') #提取指定元素属性为type的值

get_text():提取文本内容
示例:

poco('ssion').get_text() #提取指定元素的文本内容

exists():判断元素是否存在
示例:

poco('ssion').exists() #判断指定元素是否在当前屏幕上存在,返回True

元素文本正则匹配:

poco(textMatches='^测试.*$', type='Button', enable=True)

二、 元素操作

click():点击操作

def click(self, focus=None, sleep_interval=None): 

focus:值为:(x,y)或“anchor”或“center”。(x,y)意思是距元素左上角的偏移点,值必须在0~1范围内。
center是指点击ui元素边界框的中心。 anchor”是指监视器中UI包围盒的小红点。
sleep_interval:点击操作后等待的秒数。默认值为无,这里默认睡眠间隔。这个值可以通过POCO初始化进行配置。
示例:

poco('home_bottom_navigator').click() #无参数默认点中间位置无间隔时间
poco('home_bottom_navigator').click([0.5, 0.5]) #相当于点中间位置
poco('home_bottom_navigator').click([0.5, 0.5],3) #传参,点击元素中间红点后等待3秒

rclick():右键点击

def rclick(self, focus=None, sleep_interval=None): 

focus:同click方法
sleep_interval:同click方法

double_click():双击操作

def double_click(self, focus=None, sleep_interval=None): 

focus:同click方法
sleep_interval:同click方法

long_click():长按操作

def long_click(self, duration=2.0): 

duration:整个动作持续时间

swipe():滑动操作

def swipe(self, direction, focus=None, duration=0.5): 

direction:坐标,可以是(x,y)格式坐标,也可以是’up’, 'down’, 'left’, 'right’ (up=[0, -0.1],down=[0, 0.1],left=[-0.1, 0],right=[0, 0.1])
focus:同click方法 duration:间隔时间,float类型,默认0.5秒
示例:

node= poco('home_bottom_navigator').child('point_img')
node.swipe('up') #向上滑动
node.swipe([0.2, -0.2])  # 以45度角向上和向右滑动sqrt(0.08)单位距离

说明:swipe操作以 锚点anchor为起点,如果想改变起点可用 focus 方法,然后朝给定方向滑动,距离就是向量的长度。

drag_to:拖拽

def drag_to(self, target, duration=2.0): 

target:拖动后的目标元素
duration:间隔时间,float类型,默认2秒 备注:

区别:
darg 是从一个UI拖到另一个UI,
而 swipe 是将一个UI朝某个方向拖动。

示例: .

poco(text='比赛').drag_to(poco(text='开始')) #把比赛元素拖动到开始元素上

scroll:卷动效果

就是从一个方向一点一点的显示出来
一种特效,就是下拉页面啊,或者其他移动的时候,眼睛会比较舒适,其实区别不大。

def scroll(self, direction='vertical', percent=0.6, duration=2.0): 

direction:滚动方向。”垂直“或水平”,默认垂直 percent:在指定元素上按高或宽的滚动百分比
duration:间隔时间,float类型,默认2秒

pinch:捏合操作
双指捏合是一个比较常见的手势操作了,我们经常打开相册时用这个手势去放大、缩小图片,以便查看。

def pinch(self, direction='in', percent=0.6, duration=2.0, dead_zone=0.1): 

direction:滚动方向。”垂直“或水平”,默认垂直
percent:在指定元素上按高或宽的滚动百分比
duration:间隔时间,float类型,默认2秒 dead_zone:

focus:局部定位

def focus(self, f): 

f:同click()方法
示例:

poco('比赛').focus('center').click()  #定位到元素中间点,进行点击
poco('比赛').focus([0.5,1]).click()  #定位到元素最下边缘的中间点,进行点击

将 focus 和 drag_to 结合使用还能产生卷动(scroll)的效果,下面例子展示了如何将一个列表向上卷动半页。
第9点中的scroll实现方式就是这样的 示例:

poco(“元素”).focus([0.5, 0.8]).drag_to(poco(“元素”).focus([0.5, 0.2])) #从指定节点的中下方拖拽到中上方,比如手机端的从下往上滑动  

start_gesture():移动设备手势分解方法,
返回用于生成序列化手势操作的对象。
示例:

ui1=poco("ui1")
ui2=poco("ui2")
ui1.start_gesture().hold(1).to(ui2).hold(1).up() #在ui1元素上按下,等待1秒,拖拽到ui2元素上再等1秒,最后抬起释放

get_position():获取元素位置坐标,
返回(x, y)坐标

def get_position(self, focus=None) 

focus:同click()方法,默认空 wait():等待,直到超过timeout的时间,超时后返回元素对象 def wait(self, timeout=3)
说明: 在给定时间内等待一个UI出现并返回这个元素,如果已经存在了那就返回这个元素。如果超时还没出现,同样也会返回,但是调用这个UI的操作时会报错。

经验:结合exists()方法可以判断元素是否出现,比如: poco(“元素”).wait(4).exists() #如果结果是True则元素存在,如果False则元素不存在
wait_for_appearance():等待出现,

若超时返回

PocoTargetTimeout def wait_for_appearance(self, timeout=120) 

备注: wait_for_appearance()同wait()的区别:前者超时没找到元素直接返回异常PocoTargetTimeout,后者超时后还返回元素当调用时会报错。
wait_for_disappearance():等待未出现,
若超时返回

PocoTargetTimeout def wait_for_disappearance(self, timeout=120):  

attr():获取属性 def attr(self, name):
name:属性名 示例:

poco("节点").attr('text')

说明:通过给定的属性名检索ui元素的属性。如果属性不存在,则返回none。
属性名可以是以下类型之一,也可以是由SDK实现的任何其他自定义类型: -

- visible: whether or not it is visible to user
- text: string value of the UI element
- type: the type name of UI element from remote runtime
- pos: the position of the UI element
- size: the percentage size [width, height] in range of 0~1 according to the screen
- name: the name of UI element
- ...: other sdk implemented attributes

setattr():设置属性值,
更改ui元素的属性值。

def setattr(self, name, val) 

name:属性名
val:属性值
说明:并非所有属性都可以转换为文本。如果改变不可变的属性或不存在的属性,将引发InvalidOperationException异常
exists():判断是否存在,
返回True/False

def exists(self)  

get_text():获取UI元素的文本属性,
如果没有此类属性,则返回None

def get_text(self)  

set_text():设置文本值

def set_text(self, text) 

text:文本值

get_name():获取元素名,
即属性是name的值,
attr('name’)

def get_name(self)  

get_size():获取元素size,
即属性中的size(attr('size’)),
值:size : [1, 0.76328125]

def get_size(self):  

get_bounds():获取UI元素边界框的参数

def get_bounds(self) 

说明:返回列表形式,如 (top, right, bottom, left)形式的,与标准坐标系中屏幕边缘相关的坐标。

nodes:在远程运行时中访问UI元素的只读属性。
def nodes(self) 调用方式:

poco("节点").nodes

invalidate():重新获取元素标识

def invalidate(self) 

说明:清除标志以指示重新查询或从层次结构中重新选择UI元素 等待时间:强制等待\全局隐式等待\显示等待时间
全局隐式等待:

ST.FIND_TIMEOUT=60 #设置隐式等待60秒

隐式等待
是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素

  • 如果找到则代码继续执行,直到超时没找到元素才会报错,也就是说如果在第三秒找到元素,则剩下的7秒不会被等待
    显式等待:wait()
  • 1、显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码

  • 如果不满足条件则会一直等到超时
    强制等待:sleep()

  • 隐式等待和显示等待的区别:

  • 1、隐式等待是全局的,可以随时更改的,显示等待是针对单一元素或者一组元素的

  • 2、隐式等待只能针对元素查找方法,显示等待可以自定义等待条件

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

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

相关文章

Mybatis的SqlRunner执行流程

Mybatis的SqlRunner执行流程 SqlRunner exec new SqlRunner(connection); Map<String, Object> row exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID ?", "FI-SW-01");connection.close();assertEquals("FI-SW-01", row.ge…

【QT开发(10)】QT 进程

文章目录 1.1 运行一个新进程1.2 QProcess 还可以对一些信号进行关联2 进程间通信2.1 使用共享内存实现进程通信2.2 演示 代码仓库参考 1.1 运行一个新进程 使用类 QProcess&#xff0c;允许将一个进程堪称一个顺序IO设备。 在Qt中&#xff0c;QProcess类是用于启动外部进程的…

大模型与知识图谱如何相互助力

目前各行各业在数字化、智能化发展的大势所趋下&#xff0c;信息新技术不断涌现&#xff0c;也在加快深入融合到传统实体行业应用中&#xff0c;比如知识图谱、人工智能、数字孪生等等&#xff0c;特别是基于人工智能的大模型在去年底被chatgpt的带领下涌现出一波又一波的浪潮&…

驱动开发1 概念、内核模块编程、内核消息打印函数printk函数的使用、内核模块传参、内核导出符号

1 驱动相关概念 2 内核模块编程 内核模块编写实例代码注释 #include <linux/init.h> #include <linux/module.h>//入口函数&#xff0c;安装内核模块时执行 static int __init mycdev_init(void) {//static 修饰当前函数只能在本文件使用//int 函数的返回值类型&a…

【Leetcode】【中等】1726.同积元组

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/tuple-with-same-product/ 给你…

适用于 Mac 电脑的 10 款最佳数据恢复工具集

无论是个人照片还是重要的商业文档&#xff0c;对于那些依赖计算机获取重要文件的人来说&#xff0c;数据丢失都是一场噩梦。 值得庆幸的是&#xff0c;Mac用户可以使用各种数据恢复工具&#xff0c;可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c;我们将采用适用于…

Arrays 中的 asList()方法

public static <T> List<T> asList&#xff08; T . . . a &#xff09;{ return new ArrayList<>&#xff08;a&#xff09;&#xff1b; } 返回由指定数组支持的固定大小的 list集合。对数组所做的更改将在返回的 l…

【USRP】通信之有线通信

有线通信&#xff1a; 有线通信是指使用物理线路或媒体&#xff08;例如&#xff0c;铜线、同轴电缆、光纤&#xff09;进行数据、声音和视频传输的通信方式。由于它依赖于实体传输媒介&#xff0c;有线通信通常具有较高的稳定性和可靠性&#xff0c;并能支持长距离的高带宽通…

input框输入中文时,输入未完成触发事件。Vue中文输入法不触发input事件?

前言 在做搜索输入框时&#xff0c;产品期待实时搜索&#xff0c;就是边输入边搜索&#xff0c;然而对于中文输入法出现的效果&#xff0c;不同的产品可能有不同的意见&#xff0c;有的觉得输入未完成也应该触发搜索。但有的却认为应该在中文输入完成后再触发搜索。我发现在vu…

Docker Swarm 集群搭建

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.准备主机 搭建一个 docker swarm 集群&#xff0c;包含 5 个 swarm 节点。这 5 个 swarm 节点的 IP 与暂 时的角色分配如下&#xff08;注意&#xff0c;搭建完成后会切换角色&#xff…

23年上半年上午题复习

敏捷方法 耦合 软件维护 消息 面向对象测试 面向对象设计原则 包图 原型模式 数据库三级模型 数据库函数依赖 哈夫曼树 左0右1 折半查找 画一个折半查找树&#xff0c;这个树只会往一个方向查找&#xff0c;一个节点不会同时出现左右子树&#xff0c;较小的作为左子树&#…

git将当前分支A强制推送远程分支pro上

前言 开发中基于线上分支pro创建了A分支&#xff0c;开发完成之后。又基于线上分支pro创建了B分支&#xff0c;都以此合并到测试分支&#xff0c;两个分支更改中都动用部分共同的文件&#xff0c;这就导致后续开发合并代码越来越乱&#xff0c;这时你想把本地开发的分支强推到…

数据库设计阶段-架构真题(五十七)

下面关于联合需求计划JRP叙述&#xff0c;不正确的是&#xff08;&#xff09;。 JRP是一种相对成本较高但十分有效的需求获取方法在讨论期间尽量避免使用专业术语JRP的主要目的是对需求进行分析和验证在JRP实施之前&#xff0c;应制定详细的议程&#xff0c;并严格遵照议程进…

力扣每日一题57:插入区间

题目描述&#xff1a; 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#x…

通义大模型使用指南之通义千问

一、注册 我们可以打开以下网站&#xff0c;用手机号注册一个账号即可。 通义大模型 (aliyun.com) 二、使用介绍 如图&#xff0c;我们可以看到有三个大项功能&#xff0c;通义千问、通义万相、通义听悟。下来我们体验一下通义千问的功能。 1、通义千问 通义千问主要有两个功能…

如何使用VSCode将iPad Pro转化为功能强大的开发工具?

文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…

# 开发趋势 Java Lambda 表达式 第三篇

开发趋势 Java Lambda 表达式 第三篇 一&#xff0c;Lambda 整合集合常规操作 List Java Lambda 表达式可以与List集合和常规操作进行整合&#xff0c;以提供一种更简洁、更可读的代码编写方式。以下是几个示例&#xff1a; 集合遍历操作&#xff1a; List<String> n…

【分布式缓存】关于 Memcached 的几个常见问题

关于 Memcached 的几个常见问题 1.Memcached 是怎么工作的&#xff1f;2.Memcached 最大的优势是什么&#xff1f;3.Memcached 和 MySQL 的 querycache 相比&#xff0c;有什么优缺点&#xff1f;4.Memcached 和服务器的 local cache&#xff08;比如 PHP 的 APC、mmap 文件等&…

使用IO流完成项目实战水果库存系统

以下内容本人都是在 Maven 工程下总结的 需求介绍显示主菜单让程序无线运行下去加载数据显示库存列表根据名称查找特定库存记录添加库存记录查看_下架_退出功能实现持久化数据 package com.csdn.fruit.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lom…

Http长连接同一个socket多个请求和响应如何保证一一对应?

HTTP/2引入二进制数据帧和流的概念&#xff0c;其中帧对数据进行顺序标识&#xff0c;如下图所示&#xff0c;这样浏览器收到数据之后&#xff0c;就可以按照序列对数据进行合并&#xff0c;而不会出现合并后数据错乱的情况。同样是因为有了序列&#xff0c;服务器就可以并行的…