学习笔记-airtest自动化
笔记目录:https://blog.csdn.net/weixin_/article/details/
昨天下了雨,今天刮了风,明天太阳就出来了
多机协作脚本
批量执行脚本
API
- 平台无关API
- 平台相关API
简单的代码案例
使用pycharm问题汇总
常见的pip命令
其他
- 运行多个子脚本
- 坐标使用
- 局部截图
- 局部找图
- 指定截图保存的路径和名称
- 多指滑动
- 对日志信息等级的设定
- 如何安排连接设备、初始化poco和打开应用的脚本顺序
文字识别
一:多机协作脚本
可以通过 set_current 接口来切换当前连接的手机,在命令行运行脚本时,只需要将手机依次使用 --device Android:/// 添加到命令行中即可,device()接口可以获取到当前使用中的设备
airtest run untitled.air --device Android:///serialno1 --device Android:///serialno2 --device Android:///serialno1
https://airtest.doc.io.netease.com/tutorial/4_Android_automated_testing_one/
也可以这样,在Airtest的全局变量G.DEVICE_LIST中看到所有当前连接中的设备
from airtest.core.api import connect_device dev1 = connect_device("Android://127.0.0.1:5037/serialno1") # 连上第一台手机 dev2 = connect_device("Android://127.0.0.1:5037/serialno2") # 第二台手机
print(G.DEVICE_LIST) # 此时设备列表为[dev1, dev2] # 传入数字0切换当前操作的手机到第1台 set_current(0) # 切换当前操作的手机到序列号为serialno2的手机 set_current("serialno2") # 使用device()接口获取当前连接中的设备Android对象 current_dev = device()
如果是使用poco,要初始化两个poco
from airtest.core.api import connect_device dev1 = connect_device("Android://127.0.0.1:5037/serialno1") # 连上第一台手机 poco1 = AndroidUiautomationPoco(dev1) dev2 = connect_device("Android://127.0.0.1:5037/serialno2") # 第二台手机 poco2 = AndroidUiautomationPoco(dev2) set_current(1) # 切到第二台手机 poco2('com.google.android.calculator:id/digit_1').click() #如果是命令行形式,已经传入设备参数,则获取设备对象并初始化即可 from airtest.core.api import G print(G.DEVICE_LIST) # 假设当前总共有2台手机 poco1 = AndroidUiautomationPoco(G.DEVICE_LIST[0]) poco2 = AndroidUiautomationPoco(G.DEVICE_LIST[1])
二:批量执行脚本
在 多台手机上,同时运行多个脚本,可以通过命令行运行手机的方式实现
方法一:编写多个bat脚本来启动命令行运行 Airtest 脚本
(1)用bat文件执行单个Airtest脚本
.bat 文件是可执行文件,它包含一条或多条命令。使用 .bat 文件进行批处理操作,可以帮助我们简化日常或者重复性的操作,而且.bat 文件里面的命令也是靠 cmd.exe 解析执行的,所以我们可以在 .bat 文件中编写运行airtest脚本的命令,以此来执行airtest脚本
如我脚本在E:\xjb\jb1.air,然后新建.bat 文件
备注:::xxx 表示的是注释内容 ::关闭回显 @echo off 备注:@echo off是DOS批处理中的,不想执行的N条命令显示,使用echo off即可,如果echo off也不想显示,在前加@即可 ::切换到D盘 D: ::进入D盘的test目录 cd D:\xjb ::执行 airtest run 命令 start airtest run jb1.air exit
(2)用bat文件顺序执行多个Airtest脚本
@echo off D: cd D:\xjb title 正在执行第一个脚本 airtest run jb1.air title 正在执行第二个脚本 airtest run jb2.air title 正在执行第三个脚本 airtest run jb3.air exit
title xxx 用来指定命令提示窗口的标题,我们可以看到执行到第几个脚本了
(3)用bat文件实现多机运行
@echo off D: cd D:\xjb start "正在用oppo跑脚本" airtest run jb1.air --device Android://127.0.0.1:5037/XXX start "正在用vivo跑脚本" airtest run jb1.air --device Android://127.0.0.1:5037/XXX exit
方法二:实现任务调度、多线程运行的方案来运行脚本
有空看看
三:API
(1)平台无关API(其他平台也可以使用)
Airtest核心API:airtest.core.api module(跨平台API)
如touch,其他平台都可以使用,但是每个接口支持的平台也不一样,如android平台还额外支持了duration参数
(2)平台相关API
#获取当前android设备对象,通过该对象调用android平台的方法 dev = device()
四:简单的代码案例
from airtest.core.api import * from airtest.cli.parser import cli_setup from airtest.core.android.adb import * import os #连接设备 # connect_device("Android://127.0.0.1:5037/FIFIMFFEPVAIWCU8") #连接设备(要通过adb连接手机先) init_device("Android") if not cli_setup(): auto_setup(__file__, logdir="./log") pkg = "com.junhai" #.py文件所在的路径 pwd = os.path.dirname(__file__) #拼接起来 azlj = os.path.join(pwd,"123.apk") #前两句相当于# install("F://app/123.apk") #判断包是否已经安装,没有则安装 if pkg not in device().list_app(): install(azlj) #杀掉进程 stop_app(pkg) #唤醒屏幕 wake() #打开app start_app(pkg) #卸载apk uninstall("pkg") #清除app数据 clear_app("pkg")
五:使用pycharm问题汇总
(1)找不到airtest库
可能是pycharm使用了虚拟环境的解释器,运行个项目如果看到venv 说明是使用了虚拟环境,切换到本地环境即可

(2)小案例
from airtest.core.api import *
from airtest.cli.parser import cli_setup
from airtest.report.report import simple_report
#连接设备
connect_device("Android://127.0.0.1:5037/FIFIMFFEPVAIWCU8")
if not cli_setup():
auto_setup(__file__, logdir="./log")
# adb shell dumpsys window | findstr mCurrentFocus
pkg = "com.ss.android.ugc.aweme"
try:
# 杀掉进程
stop_app(pkg)
# 唤醒屏幕
wake()
# 打开app
start_app(pkg)
# 利用auto_setup(__file__)初始化脚本的时候,传入了一个basedir (参数值为__file__,即当前脚本所在路径)
# 程序会默认根据这个basedir去寻找脚本中存在的相对路径
touch(Template(r"static/tpl1614782118656.png", record_pos=(0.402, 0.979), resolution=(1080, 2280)))
finally:
simple_report(__file__, logpath=True, output="C://Users/AUSU/Desktop/pyTest/log/log.html")
六:常见的pip命令
更新Airtest: pip install -U airtest
更新Poco: pip install -U pocoui
卸载Airtest库: pip uninstall airtest
同时安装了 python3 和 python2
# Python2 pip2 install XXX python2 -m pip install XXX # Python3 pip3 install XXX python3 -m pip install XXX
七:其他
(1)运行多个子脚本
# 公共的引入子脚本方法 def customUsing(fiLe): print("--------引入" + fiLe + ".air--------") pathU = os.path.join("D:/test/"+fiLe+".air") using(pathU) try: # 执行jb1的login脚本 #使用绝对路径引入 customUsing("jb1") from jb1 import login login() print("-----login执行完毕-----") except Exception as e: traceback.print_exc()
(2)坐标使用
1)绝对坐标和相对坐标的切换
# 获取设备屏幕分辨率(竖屏) height = G.DEVICE.display_info['height'] width = G.DEVICE.display_info['width'] # 已知绝对坐标[311,1065],转换成相对坐标 x1 = 311/width y1 = 1065/height poco.click([x1,y1]) # 已知相对坐标[0.3,0.55],转换成绝对坐标 x2 = 0.3*width y2 = 0.55*height touch([x2,y2]) # 如果是横屏设备的话,则分辨率如下 height = G.DEVICE.display_info['width'] width = G.DEVICE.display_info['height']
#判断当前屏幕为横屏还是竖屏,并获取当前屏幕的分辨率 if G.DEVICE.display_info['orientation'] in [1,3]: height = G.DEVICE.display_info['width'] width = G.DEVICE.display_info['height'] else: height = G.DEVICE.display_info['height'] width = G.DEVICE.display_info['width']
(3)局部截图

如(0,160)(1067,551)
# crop_image()方法在airtest.aircv中,需要引入 from airtest.aircv import * auto_setup(__file__) screen = G.DEVICE.snapshot() # 局部截图 screen = aircv.crop_image(screen,(0,160,1067,551)) # 保存局部截图到log文件夹中 try_log_screen(screen)
(4)局部找图
from airtest.aircv import * auto_setup(__file__) screen = G.DEVICE.snapshot() # 局部截图 local_screen = aircv.crop_image(screen,(0,949,1067,1500)) # 将我们的目标截图设置为一个Template对象 tempalte = Template(r"png_code/设置.png") # 在局部截图里面查找指定的图片对象 pos = tempalte.match_in(local_screen) # 返回找到的图片对象的坐标(该坐标是相对于局部截图的坐标) print(pos) # 若要返回目标在整个屏幕中的坐标,则x,y都需要加上局部截图时设置的最小x、y print(pos[0]+0,pos[1]+949)
(5)指定截图保存的路径和名称
screen = G.DEVICE.snapshot() pil_img = cv2_2_pil(screen) pil_img.save("D:/test/首页.png", quality=99, optimize=True)
通过这种方式修改图片名字效率更高

然后可以通过这个删除多余的图片

(6)多指滑动
https://mp.weixin..com/s/JiIT0CkiY7zcdqUo-AI0GQ
(7)对日志信息等级的设定
import logging logger = logging.getLogger("airtest") logger.setLevel(logging.ERROR)
(8)如何安排连接设备、初始化poco和打开应用的脚本顺序
先连接设备(一般在 auto_setup 接口里面连接)–> 再打开应用(一般用 start_app 接口)–> 等应用开启完毕,最后才初始化 poco
# 连接设备 auto_setup(__file__,logdir=True,devices=["Android://127.0.0.1:5037/emulator-5554?cap_method=JAVACAP"]) #启动应用 start_app("com.NetEase") sleep(6.0) # 初始化poco from poco.drivers.unity3d import UnityPoco poco = UnityPoco()
(9)poco基础功能
八:文字识别
使用开源图像OCR文字识别软件 — Tesseract-OCR
参考:https://blog.csdn.net/showgea/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230016.html原文链接:https://javaforall.net
