airtest
airtest IDE
拖拽事件自动生成代码,提供基本事件,较为简单。
airtest文档
安装
pip install -U airtest
用命令行运行 .air 脚本
详细使用请airtest run --help 查看 airtest run xxx.air --device Android:/// --log 日志目录 --outfile xx.html --lang zh
通用api
from airtest.core.api import *
-
def init_device(platform='Android', uuid=None, **kwargs):->device
cls = import_device_cls(platform)
dev = cls(uuid, **kwargs)
G.add_device(dev)
return dev
阅读源码,该模块根据 platform 参数去airtest的对应的包中导入了相应的类。
使用:device = init_device(platform="Android",uuid="SJE5T17B17", cap_method="JAVACAP")
-
def connect_device(uri):->device
pass
此方法提供了uri连接设备的方法,最终还是调用了 init_device 方法
使用:connect_device("Android://127.0.0.1:5037/10.254.60.1:5555")
-
def auto_setup(basedir=None, devices=None, logdir=None, project_root=None, compress=None):
pass
自动配置运行环境,如果当前没有连接设备的话,就默认尝试连接Android设备,调用了 connect_device 方法。
使用:auto_setup(__file__, logdir=True, devices=['android://127.0.0.1:5037/9YJNW17629003686'])
以上三种连接方式均将device对象放入了全局变量G中。
-
def device():->device
return G.DEVICE
从全局变量G 中取出一个device对象
-
def set_current(idx):
pass
idx:为索引或序列号
将G的devices_list中取一个device放到 current_device中
使用:set_current(0)
-
def shell(cmd):
pass
在目标设备上运行远程shell指令,返回命令结果
-
def start_app(package, activity=None):
pass
def stop_app(package):
pass
在设备上启动/停止 目标应用
使用:start_app("com.netease.cloudmusic")/stop_app("com.netease.cloudmusic")
-
def clear_app(package):
pass
清理设备上的目标应用数据
使用:clear_app(package)
-
def install(filepath, **kwargs):
pass
def uninstall(package):
pass
安装卸载应用
使用:install(r"D:\demo\test.apk")/uninstall("com.netease.cloudmusic")
-
def snapshot(filename=None, msg='', quality=None, max_size=None):
pass
对目标设备进行一次截图,并且保存到文件中。
参数:
filename – 保存截图的文件名,默认保存路径为 ``ST.LOG_DIR``中
msg – 截图文件的简短描述,将会被显示在报告页面中
quality – 图片的质量,[1,99]的整数,默认是10
max_size – 图片的最大尺寸,例如 1200
-
def wake()唤醒并解锁目标设备
def home()返回HOME界面。
def touch(v, times=1, **kwargs)在当前设备画面上进行一次点击
def double_click(v)双击
def text(text, enter=True, **kwargs)输入文本
def sleep(secs=1.0)休眠
def keyevent(keyname, **kwargs)按键
def exists(v):->bool 是否存在
def find_all(v)找寻目标坐标
def assert_exists(v, msg='')断言存在
def assert_not_exists(v, msg='')断言不存在
def assert_equal(first, second, msg='')断言相等
def assert_not_equal(first, second, msg='')断言不相等
-
def swipe(v1, v2=None, vector=None, **kwargs):
pass
在当前设备画面上进行一次滑动操作。
v1 – 滑动的起点,可以是一个Template图片实例,或是绝对坐标 (x, y)
v2 – 滑动的终点,可以是一个Template图片实例,或是绝对坐标 (x, y)
vector – 滑动动作的矢量坐标,可以是绝对坐标 (x,y) 或是屏幕百分比,例如 (0.5, 0.5)
**kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档
-
def pinch(in_or_out='in', center=None, percent=0.5):
pass
在设备屏幕上执行一个双指pinch捏合操作
in_or_out – 向内捏合或向外扩大,在[“in”, “out”] 中枚举一个值
center – pinch动作的中心位置,默认值为None则为屏幕中心点
percent – pinch动作的屏幕百分比,默认值为0.5
-
def wait(v, timeout=None, interval=0.5, intervalfunc=None):->坐标
pass
等待当前画面上出现某个匹配的Template图片
v – 要等待出现的目标Template实例
timeout – 等待匹配的最大超时时长,默认为None即默认取 ST.FIND_TIMEOUT 的值
interval – 尝试查找匹配项的时间间隔(以秒为单位)
intervalfunc – 在首次尝试查找匹配失败后的回调函数
安卓api
两个重要子模块
from airtest.core.android import android
adb = android.ADB()
device = android.Android()
device:
device.get_default_device()
device.serialno
device.uuid
以上均为获取序列号
device.list_app(third_only=False)获取app列表
device.path_app(package)打印出package的完整路径
device.check_app(package):->bool 检查package在设备中是否存在
device.start_app(package, activity=None)启动应用
device.start_app_timing(package, activity)启动应用,并且返回启动耗费时间
device.stop_app(package)停止应用
device.clear_app(package)清理应用数据
device.install_app(filepath, replace=False, install_options=None)将应用安装到手机上
device.install_multiple_app(filepath:list, replace=False, install_options=None)
device.uninstall_app(package)从设备中卸载应用
device.snapshot(filename=None, ensure_orientation=True, quality=10, max_size=None)截取一张当前手机画面,默认会发送到stdout
device.swipe(p1, p2, duration=0.5, steps=5, fingers=1)在设备上执行滑动操作
p1 – 开始坐标
p2 – 结束坐标
duration – 在屏幕上滑动的时长,默认是0.5
steps – 滑动过程中的步数,默认为5
fingers – 滑动的手指数量,1或者2,默认为1
其他android接口
adb:
start_server()
kill_server()
version()
devices(state=None)
其他adb接口
Keycode表
keycode对应表如下: 0 “KEYCODE_UNKNOWN” 1 “KEYCODE_MENU” 2 “KEYCODE_SOFT_RIGHT” 3 “KEYCODE_HOME” 4 “KEYCODE_BACK” 5 “KEYCODE_CALL” 6 “KEYCODE_ENDCALL” 7 “KEYCODE_0” 8 “KEYCODE_1” 9 “KEYCODE_2” 10 “KEYCODE_3” 11 “KEYCODE_4” 12 “KEYCODE_5” 13 “KEYCODE_6” 14 “KEYCODE_7” 15 “KEYCODE_8” 16 “KEYCODE_9” 17 “KEYCODE_STAR” 18 “KEYCODE_POUND” 19 “KEYCODE_DPAD_UP” 向上 20 “KEYCODE_DPAD_DOWN” 向下 21 “KEYCODE_DPAD_LEFT” 向左 22 “KEYCODE_DPAD_RIGHT” 向右 23 “KEYCODE_DPAD_CENTER” 24 “KEYCODE_VOLUME_UP” 25 “KEYCODE_VOLUME_DOWN” 26 “KEYCODE_POWER” 27 “KEYCODE_CAMERA” 28 “KEYCODE_CLEAR” 29 “KEYCODE_A” 30 “KEYCODE_B” 31 “KEYCODE_C” 32 “KEYCODE_D” 33 “KEYCODE_E” 34 “KEYCODE_F” 35 “KEYCODE_G” 36 “KEYCODE_H” 37 “KEYCODE_I” 38 “KEYCODE_J” 39 “KEYCODE_K” 40 “KEYCODE_L” 41 “KEYCODE_M” 42 “KEYCODE_N” 43 “KEYCODE_O” 44 “KEYCODE_P” 45 “KEYCODE_Q” 46 “KEYCODE_R” 47 “KEYCODE_S” 48 “KEYCODE_T” 49 “KEYCODE_U” 50 “KEYCODE_V” 51 “KEYCODE_W” 52 “KEYCODE_X” 53 “KEYCODE_Y” 54 “KEYCODE_Z” 55 “KEYCODE_COMMA” 56 “KEYCODE_PERIOD” 57 “KEYCODE_ALT_LEFT” 58 “KEYCODE_ALT_RIGHT” 59 “KEYCODE_SHIFT_LEFT” 60 “KEYCODE_SHIFT_RIGHT” 61 “KEYCODE_TAB” 62 “KEYCODE_SPACE” 63 “KEYCODE_SYM” 64 “KEYCODE_EXPLORER” 65 “KEYCODE_ENVELOPE” 66 “KEYCODE_ENTER” 67 “KEYCODE_DEL” 68 “KEYCODE_GRAVE” 69 “KEYCODE_MINUS” 70 “KEYCODE_EQUALS” 71 “KEYCODE_LEFT_BRACKET” 72 “KEYCODE_RIGHT_BRACKET” 73 “KEYCODE_BACKSLASH” 74 “KEYCODE_SEMICOLON” 75 “KEYCODE_APOSTROPHE” 76 “KEYCODE_SLASH” 77 “KEYCODE_AT” 78 “KEYCODE_NUM” 79 “KEYCODE_HEADSETHOOK” 80 “KEYCODE_FOCUS” 81 “KEYCODE_PLUS” 82 “KEYCODE_MENU” 83 “KEYCODE_NOTIFICATION” 84 “KEYCODE_SEARCH” 85 “TAG_LAST_KEYCODE”
moneky压力测试
adb shell monkey [参数]
导出测试结果
auto_setup(__file__, logdir=True, devices=['android://127.0.0.1:5037/9YJNW17629003686'])
from airtest.report.report import LogToHtml
h1 = LogToHtml(script_root=__file__, export_dir=r'D:\Pyproject\test', lang='zh')
h1.report(output_file='result.html')
|