Airtest学习(三)

Airtest学习(三)多机协作脚本批量执行脚本一 多机协作脚本可以通过 set current 接口来切换当前连接的手机 在命令行运行脚本时 只需要将手机依次使用 deviceAndroi 添加到命令行中即可 device 接口可以获取到当前使用中的设备 airtestrunun airdeviceAnd serialno1dev serialno2dev serialno1

学习笔记-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 说明是使用了虚拟环境,切换到本地环境即可

Airtest学习(三)

(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)局部截图

Airtest学习(三)

如(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)

通过这种方式修改图片名字效率更高

Airtest学习(三)

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

Airtest学习(三)

(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基础功能

https://mp.weixin..com/s?__biz=MzUxMDc4NTkwMA==&mid=2247484579&idx=1&sn=950ebd07b063674b3a1f5f6ae2abe768&chksm=f97ce4a0ce0b6db6036fdbde8c27813813fc23011ff3208d4efeb88efd8ec888ce92567b7adf&scene=21#wechat_redirect

 

 

 

八:文字识别

使用开源图像OCR文字识别软件 — Tesseract-OCR

参考:https://blog.csdn.net/showgea/article/details/

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230016.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:19
下一篇 2026年3月16日 下午3:20


相关推荐

  • 通常每个套接字地址只允许使用一次_max无法写入配置文件

    通常每个套接字地址只允许使用一次_max无法写入配置文件写入配置文件 CString IP, Port; UpdateData(TRUE); // 将应用程序控件上面的IP和端口 更新至对应的成员变量 IP = m_IpAddress.GetString(); // 读取成员变量控件上面的IP地址将赋给strIP变量 Port.Format(L”%d”, m_iPort); // 读取成员变量控件上面的端口将赋给m_iPort变量 Wri…

    2022年8月18日
    11
  • android viewpager实现轮播「建议收藏」

    android viewpager实现轮播「建议收藏」本文是基于ViewPager实现的无限自动轮播banner分为三步:第一部分是有限手动轮播;第二部分是无限轮播;第三部分是自动轮播;第四部分是指示器适配有限手动轮播实现:布局:<androidx.viewpager.widget.ViewPagerandroid:id=”@+id/banner”android:layout_width=”match_parent”android:layout_height=”wrap_content”andro

    2022年7月22日
    14
  • QTreeview上面划线[通俗易懂]

    QTreeview上面划线[通俗易懂]因为要做一个动画编辑器功能,需要有时间标线,我使用了QTreeview作为显示控件,但是上面划线就是个大问题,经过几番尝试终于找到办法了。先上图具体办法就是继承了qtreeview并且重载paintevent这个函数voidActionTreeView::paintEvent(QPaintEvent*event){Q_UNUSED(event);QTreeView::pa

    2022年5月30日
    48
  • Kafka容错性测试

    Kafka容错性测试1.查看topic信息(“副本”是为该分区复制日志的节点列表,无论它们是引导者还是当前处于活动状态,“isr”是“同步”副本的集合。这是副本列表的子集,当前仍处于活动状态并追随领导者。)[hadoop@hadoop000tmp]$kafka-topics.sh–describe–zookeeperhadoop000:2181–topicmy-replicated-topi…

    2022年7月25日
    11
  • conda常用命令:安装,更新,创建,激活,关闭,查看,卸载,删除,清理,重命名,换源,问题

    condaupdate-nbaseconda//update最新版本的condacondacreate-nxxxxpython=3.6//创建xxxx环境condaactivatexxxx//开启xxxx环境condadeactivate//…

    2022年4月9日
    217
  • ViewStub用法介绍

    ViewStub用法介绍在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Infl

    2022年6月28日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号