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

背景:基于目前团队中推广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 = Falsefind_element = Noneif poco is None:raise Exception("poco is None")if text or textMatches:swipe_time = 0snapshot(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 = position1if 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 = Truebreakelif 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 + 1else:breakreturn 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("观察者:发现元素!!!")breakelif (time.time() - start_time) < timeout:print("--------------------观察者:等待1秒----------------")time.sleep(1)else:print("观察者:超时未发现!!")breakdef watcher(text=None, textMatches=None, timeout=10, poco=None):print("观察者:启动!!")# 目标元素find_element = Noneif 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 Processp = Process(target=loop_watcher, args=(find_element, timeout,))p.start()​

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

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

相关文章

毕业设计选题:基于ssm+vue+uniapp的校园商铺系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

需求3:照猫画虎

说起写需求&#xff0c;其实对于我这种小白而言&#xff0c;接到一个需求&#xff0c;最好的方式就是照猫画虎。 因为我从0到1写&#xff0c;以我现在这种水平&#xff0c;根本就不可能完成。所以照猫画虎&#xff0c;模仿着来写是最好的提升方法。 之前在聊天的时候&#xf…

Windows11家庭版修改用户密码策略为永不过期。

今天有个朋友找到我说&#xff0c;他的电脑密码老是过期然后需要修改&#xff0c;让我帮忙改一下密码策略&#xff0c;改为永不过期。 下面就来操作一下吧。 这里有个小小的坑&#xff0c;就是win11的家庭版是没有 gpedit.msc的&#xff0c;也就不能直接cmd打开本地策略便器&…

day20JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…

Linux下进程间的通信--共享内存

共享内存概述&#xff1a; 共享内存是进程间通信的一种方式&#xff0c;它允许两个或多个进程共享一个给定的存储区。共享内存是最快的一种IPC形式&#xff0c;因为它允许进程直接对内存进行读写操作&#xff0c;而不需要数据在进程之间复制。 共享内存是进程间通信&#xff…

Linux 中的 Screen 命令详解

目录 前言1. 什么是 Screen 命令2. Screen 命令的主要功能3. Screen 命令的安装4. Screen 的基础使用4.1 启动一个新的 Screen 会话4.2 恢复一个断开的 Screen 会话4.3 退出一个 Screen 会话 5. Screen 命令的常用参数5.1 -S&#xff1a;指定会话名称5.2 -r&#xff1a;恢复会话…

使用SpringCloud构建可伸缩的微服务架构

Spring Cloud是一个用于构建分布式系统的开源框架。它基于Spring Boot构建&#xff0c;并提供了一系列的工具和组件&#xff0c;用于简化开发分布式系统的难度。Spring Cloud可以帮助开发人员快速构建可伸缩的微服务架构。 要使用Spring Cloud构建可伸缩的微服务架构&#xff0…

PCIe进阶之TL:Request Handling Rules

1 Handling of Received TLPs 本节介绍接收到的 TLP 在数据链路层经过完整性验证之后,这些 TLP 在事务处理层时的处理方式。这些规则如下图所示: 接收侧会忽略保留字段。如果 Fmt 字段显示存在至少一个 TLP Prefix : (1)通过检查后续 DWORD 的第一个字节中的 Fmt 字段,…

HTML中直接创建一个“onoff”图形开关包括css+script

1. HTML中直接创建一个“onoff”图形开关 下面是一个完整的HTML文档示例 在HTML中直接创建一个“onoff”图形开关&#xff08;通常指的是一个类似于物理开关的UI组件&#xff0c;可以切换开或关的状态&#xff09;&#xff0c;并不直接支持&#xff0c;因为HTML主要用于内容的…

研究生存指南:必备Zotero插件,让你的文献管理更轻松

在读研阶段&#xff0c;我经常面临大量文献阅读和项目研究的任务。忽略文献整理会导致后续使用时非常不便&#xff0c;查找困难且混乱。导师向我们推荐了 Zotero&#xff0c;经过亲身试用&#xff0c;我发现它非常好用&#xff01;zotero有非常多的插件&#xff0c;能够一个就满…

web学习——VUE

VUE&Element 今日目标&#xff1a; 能够使用VUE中常用指令和插值表达式能够使用VUE生命周期函数 mounted能够进行简单的 Element 页面修改能够完成查询所有功能能够完成添加功能 1&#xff0c;VUE 1.1 概述 接下来我们学习一款前端的框架&#xff0c;就是 VUE。 Vue 是…

kubernetes调度2

1、各种缩写的应用 [rootk8s-master test]# kubectl get rsNAME DESIRED CURRENT READY AGEtest001-64c7957b5c 2 2 2 8m59stest001-698b98bb8f 0 0 0 12m[rootk8s-master test]# kubectl get replicas…

昂科烧录器支持Senasic琻捷电子的蓝牙低功耗芯片SNP746

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Senasic琻捷电子的蓝牙低功耗芯片SNP746已经被昂科的通用烧录平台AP8000所支持。 SNP746是一款蓝牙低功耗芯片&#xff0c;集成了压力传感器和加速度传感器的测量电路。它是为…

git报错:无法读取远程分支 ‘origin‘ does not appear to be a git repository

问题分析 push上传的时候本地分支和远程分支断开连接 所以重新链接即可 排查问题 1. 查看是否有分支&#xff0c;检查分支是否正确 git branch -v 2. 查看连接是否断开&#xff0c;断开无内容展示 查看远程仓库详细信息&#xff0c;可看到仓库地址 git remote -v 解决…

Linux 信号的产生

1. 概念 在Linux系统中&#xff0c;信号是一种进程间通信的机制&#xff0c;它允许操作系统或其他进程向特定进程发送异步通知。我们可以通过命令 kill -l来查看信号的种类&#xff1a; Linux系统中的信号可以分为两大类&#xff1a;传统信号和实时信号。从上图可以看出它们分…

htop(1) command

文章目录 1.简介2.格式3.选项4.交互式命令5.示例6.小结参考文献 1.简介 htop 是一种交互式、跨平台的基于 ncurses 的进程查看器。 类似于 top&#xff0c;但 htop 允许您垂直和水平滚动&#xff0c;并使用指向设备(鼠标)进行交互。您可以观察系统上运行的所有进程&#xff0…

24年蓝桥杯及攻防世界赛题-MISC-2

11 Railfence fliglifcpooaae_hgggrnee_o{cr} 随波逐流编码工具 分为5栏时,解密结果为:flag{railfence_cipher_gogogo} 12 Caesar rxms{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} mode1 #12: flag{you_have_learned_caesar_encryption} 随波逐流编码工具 13 base64 base64解…

iOS17找不到developer mode

iOS17找不到开发者模式 developer mode 下载过app之后、弹窗Developer Mode Required之后&#xff0c;这个菜单就出现了&#xff08;之前死活找不到&#xff09;。 背景&#xff1a;用蒲公英分发测试app&#xff0c;有个同事买了新机(iphone 15 pro max)&#xff0c;添加了白名…

ppt一键生成免费版软件有哪些?如何高效生成论文答辩?

答辩经验丰富的人都知道&#xff0c;制作论文答辩ppt是一项既繁琐又耗时的工作。 我们需要从数万字的论文中提炼关键点&#xff0c;梳理内容的逻辑关系&#xff0c;然后进行细致的排版和美化&#xff0c;最后还要进行反复的检查和试讲。整个过程不仅耗费时间&#xff0c;而且需…