备注:未经博主允许禁止转载
个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力)
笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客
个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客
参考官方博客:网易AirtestProject 的个人主页 - 动态 - 掘金
参考官方文档:欢迎使用 - Airtest Project Docs
目录
一:多机协作脚本
可以通过 set_current
接口来切换当前连接的手机,在命令行运行脚本时,只需要将手机依次使用 --device Android:///
添加到命令行中即可,device()
接口可以获取到当前使用中的设备
airtest run untitled.air --device Android:///serialno1 --device Android:///serialno2 --device Android:///serialno1
四、如何在Android手机上进行自动化测试(上) - Airtest Project Docs
也可以这样,在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)多指滑动
(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