AirTest 基本操作范例和参数解释(一)

news2024/9/20 14:57:00

背景:基于目前团队中推广UIAutomation,采用了网易的UI自动化平台,平台兼容iOS、Android和WEB,是个跨平台的多库平台,利用poco和python进行脚本编写和开展自动化,但是在日常使用中有些同学对于一些关键字和参数有时记不住或者使用错误,这里特地整理完备供大家日常参考。

一、基本操作

1.前置用例引用

        可以将一些通用的操作写在一个.air脚本中,然后在其他脚本中import它

from airtest.core.api import using
using("replace_install.air") # 需要使用相对路径,不然找不到.air
import replace_install

2.引用自定义的公共类或方法

        在编写自动化的过程中,有一些自定义的方法或类,需要在.air下的.py中引用时候,需要将项目路径添加到环境变量中 

import sys import os # 必填,将项目目录添加到系统环境变量中 sys.path.append(‘项目路径’)

3.元素定位方式

(1)尽量使用text定位元素

poco(text="立即体验") poco(textMatches="^.*滑动来解锁.*$")#正则来模糊定位

(2)如果不能直接定位,建议使用局部布局

        子元素

poco(text='main_node').child(text='list_item')

        后代

poco(text='main_node').offspring(text='name')

        父

poco(text='main_node').parent()

        所有子元素

poco(text='main_node').children()

        兄弟元素

poco(text='main_node').sibling(text='name')

备注:

  • 因为text变化的概率相对较小,所以建议使用text,且脚本易读;
  • resourceid不建议,因为release版会混淆,除非公司对resourceid进行了统一设计和规划,且release版本不混淆。

4.元素操作

(1)点击元素身上的某一点

        通过相对坐标,控制点击的具体位置。左上角(0, 0),右下角(1, 1),横坐标为x,纵坐标为y。

(2)等待元素出现或消失

        实际写用例时,有一些扫描或缓冲场景,需要等待元素出现或消失,才能进行下一步操作。

        当使用wait_for_appearance或wait_for_disappearance时,建议处理PocoTargetTimeout,并截图,以方便在报告中查看出错时的页面情况

try:
    poco(text='main_node').wait_for_appearance(timeout=10)
    poco(text='main_node').wait_for_disappearance(timeout=10)
except PocoTargetTimeout:
    snapshot(msg="元素出现或未出现")

(3)滑动和拖动

        拖动

poco('star').drag_to(poco('shell'))

        滑动

poco('Scroll View').swipe([0, -0.1]) # 滑动指定坐标 
poco('Scroll View').swipe('up') # 向上滑动 
poco('Scroll View').swipe('down') # 向下滑动

        向量滑动

x, y = poco('Scroll View').get_position()
end = [x, y - 0.1]
dir = [0, -0.1]
poco.swipe([x, y], end)  # 从A点滑动到B点
poco.swipe([x, y], direction=dir)  # 从点A向给定方向和长度进行滑动

(4)获取元素信息(重要手段)

"""
attribute name, it can be one of the following or any other customized type implemented by 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
"""


poco(text="text_content").attr("checkable")
poco(text="text_content").get_position()
poco(text="text_content").get_text()
....

(5)连续滑动与自定义滑动操作

from airtest.core.api import * dev = device() # 获取当前手机设备

        手指按照顺序依次滑过3个坐标,可以用于九宫格解锁

dev.minitouch.swipe_along([(100, 100), (200, 200), (300, 300)])

        自定义操作:实现两个手指同时点击的操作

from airtest.core.android.minitouch import *

multitouch_event = [
DownEvent((100, 100), 0),  # 手指1按下(100, 100)
DownEvent((200, 200), 1),  # 手指2按下(200, 200)
SleepEvent(1),
UpEvent(0), UpEvent(1)]  # 2个手指分别抬起

device().minitouch.perform(multitouch_event)

        自定义操作:三只滑动操作

from poco.utils.track import *

tracks = [
MotionTrack().start([0.5, 0,5]).move([0.5, 0.6]).hold(1).
MotionTrack().start([0.5, 0,5]).move([0.5, 0.6]).hold(1).
MotionTrack().start([0.5, 0,5]).move([0.5, 0.6]).hold(1)
]

poco.apply_motion_tracks(tracks)

        手       势操作:点击ui1保持1秒,拖动到ui2并保持1秒,然后抬起

ui1.start_gesture().hold(1).to(ui2).hold(1).up()

(6)点击元素偏移位置

        点击, focus为偏移值,sleep_interval为点击后的间隔时间

poco(text="立即清理").click(focus=(0.1, 0.1), sleep_interval=5)

(7)隐性等待元素

        隐形等待元素出现,元素出现后,wait()方法结束(隐藏元素常用方法)

poco(text="立即清理").wait(timeout=5)

(8)判断元素是否存在

        判断元素是否存在,存在返回True

poco(text="立即清理").exists()

(9)UI状态清除(请运行完毕之后,务必执行)

        在poco里选择出来的ui都是代理对象,在执行同一个用例里,一个ui控件选出来后能持续多长时间有效这个是要看android那回收ui资源的策略的,每个厂商的差异比较大.

        对于cocos2d-x引擎的poco,由于使用的是快照模式,获取到UI状态后如果UI状态确实发生了改变,需要调用ui.invalidate()进行重新获取。

ui = poco(text="立即清理")
ui.click()
ui.invalidate()
ui.click()

(10)long click

        长按操作,单位:秒

poco(text="立即清理").long_click(duration=2.0)

(11)两指挤压收缩操作

        在给定的范围和持续时间下,在UI上两指挤压收缩操作

poco.pinch(direction='in', percent=0.6, duration=2.0, dead_zone=0.1)

(12)根据UI滑动

        根据UI的给定高度或宽度,滑动距离的百分比:

        从底部上滑5秒

poco.scroll(direction='vertical', percent=1, duration=5)

        从顶部下滑5秒

poco.scroll(direction='vertical', percent=-1, duration=5)

二、异常类

        建议对每一个可能出现异常的地方都进行异常处理,并截图,最后看报告时方便迅速定位问题。

1.InvalidOprationException

        这个异常特指无效的操作,或者不起作用的操作

try:
    poco.click([1.1, 1.1])  # click outside screen
except InvalidOperationException:
    snapshot(msg="出现异常")

2.PocoNoSuchNodeException(经常遇到)

        如果从一个不存在的UI空间读取属性或操作,就会出现该异常。

node = poco("not existed node")
try:
    node.click()
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")
try:
    node.attr('text')
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")

3.PocoTargetTimeout

        这个异常只会在你主动等待UI出现或消失时抛出,和 PocoNoSuchNodeException 不一样,当你的操作速度太快,界面来不及跟着变化的话,你只会遇到 PocoNoSuchNodeException 而不是 PocoTargetTimeout ,其实就是在那个UI还没有出现的时候就想要进行操作。

node = poco("not existed node")
try:
    node.click()
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")
try:
    node.attr('text')
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")

4.PocoTargetRemovedException

        如果操作速度远远慢于UI变化的速度,很可能会出现这个异常。当且仅当访问或操作一个刚才存在现在不在的UI元素时,才会出现,并且一般不会出现。

try:
    poco(text="demo").click()
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")

三、封装API好的函数

1.滚动查找元素(poco_swipe_to)

        滚动查找元素,当找到元素后,滑动元素到页面中间。

        公式:poco_swipe_to(text=None, textMatches=None, poco=None)

# 滚动查找元素
def poco_swipe_to(text=None, textMatches=None, poco=None):
    find_ele = False
    find_element = None
    if poco is None:
        raise Exception("poco is None")
    if text or textMatches:
        swipe_time = 0
        snapshot(msg="开始滚动查找目标元素")
        if text:
            find_element = poco(text=text)
        elif textMatches:
            find_element = poco(textMatches=textMatches)
        while True:
            snapshot(msg="找到目标元素结果: " + str(find_element.exists()))
            if find_element.exists():
                # 将元素滚动到屏幕中间
                position1 = find_element.get_position()
                x, y = position1
                if y < 0.5:
                    # 元素在上半页面,向下滑动到中间
                    poco.swipe([0.5, 0.5], [0.5, 0.5+(0.5-y)], duration=2.0)
                else:
                    poco.swipe([0.5, 0.5], [0.5, 0.5-(y-0.5)], duration=2.0)
                snapshot(msg="滑动元素到页面中间: " + str(text) + str(textMatches) )
                find_ele = True
                break
            elif swipe_time < 30:
                poco.swipe([0.5, 0.8], [0.5, 0.4], duration=2.0)
                # poco.swipe((50, 800), (50, 200), duration=500)
                swipe_time = swipe_time + 1
            else:
                break
    return find_ele

2.等待任一元素出现(poco.wait_for_any)

try:
    poco(text="demo").click()
except PocoNoSuchNodeException:
    snapshot(msg="出现异常了呀")

3.等待所有元素(poco.wait_for_all)

try:
    poco(text="demo").click()
except PocoNoSuchNodeException:
    snapshot(msg="出现异常")

4.观察者函数(watcher)

        说明:利用子进程对页面元素进行监控,发元素后,自动操作。

        适用场景:多用于不可预测的弹窗或元素

        公式:watcher(text=None, textMatches=None, timeout=10, poco=None)

​
def loop_watcher(find_element, timeout):
    start_time = time.time()
    while True:
        # find_element.invalidate()
        if find_element.exists():
            find_element.click()
            print("观察者:发现元素!!!")
            break
        elif (time.time() - start_time) < timeout:
            print("--------------------观察者:等待1秒----------------")
            time.sleep(1)
        else:
            print("观察者:超时未发现!!")
            break

def watcher(text=None, textMatches=None, timeout=10, poco=None):
    print("观察者:启动!!")
    # 目标元素
    find_element = None
    if poco is None:
        raise Exception("poco is None")
    if text or textMatches:
        if text:
            find_element = poco(text=text)
        elif textMatches:
            find_element = poco(textMatches=textMatches)

    # 定义子线程: 循环查找目标元素
    from multiprocessing import Process
    p = Process(target=loop_watcher, args=(find_element, timeout,))
    p.start()

​

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

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

相关文章

db2恢复数据库

db2licm -l检查下license IBM Support: Fix Central - Please wait, Select fixes db2 force application all db2ckbkp -H JYC.0.DB2.NODE0000.CATN0000.20240603223001.001 db2 "restore db jyc logtarget x:\db2\log" db2 "rollforward db jyc to end of log…

音频北斗定位系统有什么用?

在当今科技飞速发展的时代&#xff0c;定位技术已经成为我们日常生活和各行各业不可或缺的一部分。其中&#xff0c;音频北斗定位系统作为一种新兴的定位技术&#xff0c;正逐渐展现出其独特的优势和应用价值。那么&#xff0c;到底音频北斗定位系统有什么用呢?我们一起来了解…

住宅代理IP如何提高 IP声誉?

你有没有遇到过类似的问题&#xff1f;发送的邮件被标记为垃圾邮件并被屏蔽、访问某些网站被拒绝、广告效果不理想&#xff0c;甚至网上交易无缘无故被拒绝&#xff1f;这到底是什么原因造成的&#xff1f;其实&#xff0c;这些问题可能都和 IP 信誉息息相关。 如果你的 IP 地址…

一文读懂HPA弹性扩展以及实践攻略

一文读懂HPA弹性扩展以及实践攻略 目录 1 概念&#xff1a; 1.1 什么是弹性扩展1.2 HPA 的工作原理1.3 通过监控指标来调整副本数 1.3.1 计算公式说明1.3.2 平均值计算1.3.3 未就绪 Pod 和丢失的指标处理1.3.4 多指标支持1.3.5 缩减副本的平滑策略 1.4 HPA的优缺点 2 实践攻略…

微服务保护学习笔记(五)Sentinel授权规则、获取origin、自定义异常结果、规则持久化

文章目录 前言4 授权规则4.1 基本原理4.2 获取origin4.3 配置授权规则 5 自定义异常结果6 规则持久化 前言 微服务保护学习笔记(一)雪崩问题及解决方案、Sentinel介绍与安装 微服务保护学习笔记(二)簇点链路、流控操作、流控模式(关联、链路) 微服务保护学习笔记(三)流控效果(…

C语言 14 结构体 联合体 枚举

之前认识过很多种数据类型&#xff0c;包括整数、小数、字符、数组等&#xff0c;通过使用对应的数据类型&#xff0c;就可以很轻松地将数据进行保存了&#xff0c;但是有些时候&#xff0c;这种简单类型很难去表示一些复杂结构。 结构体 比如现在要保存 100 个学生的信息&am…

本地部署一个轻量化智能聊天服务Vocechat并实现异地远程交互

文章目录 前言1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 前言 本文主要介绍如何在本地群晖NAS搭建一个自己的聊天服务Vocechat&#xff0c;并结合内网穿透工具实现使用任意浏览器远程访问进行智能聊天…

我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆

本教程基于自研的AI工具箱Tauri版进行VideoReapeat视频解说复述克隆。 VideoReapeat视频解说复述克隆 是自研的AI工具箱Tauri版中的一款专用模块&#xff0c;旨在通过AI技术对视频解说内容进行复述和克隆。该工具可自动洗稿并重新生成视频解说&#xff0c;通过简单配置即可对大…

协同编程的艺术:SIDE 让团队协作更上一层楼

一、协同编程的现状 在当前软件开发中&#xff0c;团队协作面临着诸多挑战。沟通不畅常常导致项目进度延迟&#xff0c;版本控制复杂使得代码合并困难重重。传统 IDE 在协同工作方面存在明显的局限性&#xff0c;缺乏实时协作功能&#xff0c;团队成员之间的沟通工具也不够完善…

如何上传tauri项目到csdn gitcode

如何上传tauri项目到csdn gitcode 首先保证项目目录有.gitignore&#xff0c;避免不必要的文件上传分享。 gitignore文件 # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log*node_modules dist dist-ssr *.local# Editor …

浅谈如何入门游戏漏洞挖掘,零基础入门到精通,收藏这一篇就够了

引言 每个白帽子心中&#xff0c;都有一团火 那就是对网络安全的信念 哪怕&#xff0c;是一条少有人走的路 补天希望与更多同路人携手&#xff0c;再向前一步 2021年补天平台启动“技术模块” 牛年新春特别分享单元 大年初一至初七 每天一个精选技术方向 每天一条原创…

QMT获取可转债行情数据方法介绍!支持QMT量化软件的券商平台?

获取可转债行情 为了获取转债的日线/1m/1d的k数据&#xff0c;以通过数据订阅形式获取最新行情subscribe_quote。如果您需要获取历史数据&#xff0c;可以使用download_history_data函数下载相关数据&#xff0c;然后使用get_market_data_ex函数提取所需的信息。这样&#xff…

Smartbi AIChat应用案例-某保险集团内部经营分析

案例简介 某保险企业面对大数据时代下的业务发展挑战&#xff0c;面临数据查询、分析与探索需求的激增。然而&#xff0c;当前的数据基础设施与应用方式已难以满足业务快速发展的需求。企业面临分析链路长、报表时效性低、制作效率低且灵活度不足、无效报表堆积等困局。为打破这…

探索《越南语翻译通》App:高效语言学习的利器

在当今这个全球化的世界里&#xff0c;语言学习变得越来越重要。随着科技的发展&#xff0c;我们有了更多便捷的工具来帮助我们学习新的语言。今天&#xff0c;我们来探索一款名为《越南语翻译通》的App&#xff0c;它正逐渐成为语言学习者的新宠。 《越南语翻译通》App的特点…

Linux安装(带VM激活码)

1.安装Vmare WorkStation虚拟机 VMware Workstation Pro是VMware&#xff08;威睿公司&#xff09;发布的一代虚拟机软件&#xff0c;中文名称为"VMware 工作站".它的主要功能是可以给用户在单一的桌面上同时运行不同的操作系统&#xff0c;它也是可进行开发、测试、…

笑不活了!薅走羊毛党20亿跑路?这生意我横竖没看懂……

昨天&#xff0c;各种八卦群传出一张非常离谱的截图&#xff0c;被无数吃瓜群众称为这是今年最好笑的事&#xff0c;纷纷表示能不能把我拉群里&#xff0c;让我再笑会……。 截图大概是这样的&#xff0c;博主开头先是发了几个哈哈哈&#xff0c;隔着屏幕都能感受到这事到底有…

3个月9次迭代,快手可灵AI面向全球发布1.5模型

9月19日&#xff0c;可灵AI迎来重磅升级&#xff0c;视频生成新增可灵1.5模型&#xff0c;在画质质量、动态质量、美学表现、运动合理性以及语义理解等方面均有显著提升。与此同时&#xff0c;可灵AI还引入了全新的“运动笔刷”功能&#xff0c;进一步提升视频生成的精准控制能…

电能计量,三相电基础

1. 三相交流电基础 三相交流电由三个频率相同、振幅相等、相位依次互相差120的交流电势组成。这样组织的三相电有一个特点&#xff0c;就是任何一个时刻&#xff0c;三相电的电压之和都等于零。这个特性使得本来需要六根导线来传输三组电压的减少到了三根导线&#xff0c;这样…

访问者模式:将算法与对象结构分离的设计模式

在软件开发中&#xff0c;我们常常需要对对象结构中的各个元素进行不同的操作。比如在编译器中&#xff0c;我们可能需要对抽象语法树&#xff08;AST&#xff09;的各个节点进行语法检查、代码生成、优化等操作。如果将这些操作直接嵌入到节点类中&#xff0c;会导致类的职责过…

一、桥式整流电路

桥式整流电路 1、二极管的单向导电性: 伏安特性曲线: 理想开关模型和恒压降模型 2、桥式整流电流流向过程 输入输出波形: 3、计算:Vo,lo,二极管反向电压。 学习心得