手机app自动化操作工具airtest之入门篇
airtest自动化测试工具
airtest是网易开发的一款自动化测试工具,主要用于游戏自动化开发和测试,目前支持对windows应用、手机app等,同时支持录制操作,甚至达到无需代码编写即可完成测试,能够识别图中是否存在目标元素(其实是比较目标图片和截图,确定目标是否在截图中)。
它的操作相对appium来说更容易上手,进行移动端测试过程中,通常是利用其poco库来做自动化。
微信自动化操作
环境:
Windows 10操作系统
python 版本 3.7
airtest IDE,版本 1.2.1
adb工具,是手机操作自动化的基础。
对于手机app页面元素的分析,可以采用 airtest IDE自带的Android模块的 UI渲染树查看,或者使用 Android Studio 的SDK插件 uiautomatorviewer 来实现。
操作步骤
1、连接手机和电脑
使用USB数据线连接手机和电脑,启用手机的开发者选项,启用方法请自行百度,开启之后,将USB调试打开。
2、接通手机
这里有两种方式,一种是通过命令行执行adb命令,另外一种是通过airtest界面操作。
airtest界面操作,即打开airtest软件之后,点击右侧的 “刷新ADB”,正常情况下会出现手机设备信息,点击 connect 即可。
之后会出现手机画面:
对于出现的手机画面,使用鼠标进行点击和滑动,可以达到 操作手机的效果。
软件左下角处“Poco”栏的下拉菜单选择“Android”,即可出现手机页面的元素审查结果,可以对树形结构进行点击展开,也可以对画面进行锁定等操作。
命令行操作,只需执行:adb devices
出现以下内容,则是正常的:
List of devices attached
CxsxsxsxE62w133 device
注意:那个device前面是手机***,而device这个是关键,如果是unauthorized就是连接失败的。
这里说一下关闭连接,需要确保adb.exe进程是关闭的,然后才能正常弹出设备。
对于airtest连接的断开操作,只需找到软件右上角的“Phone assist”(图标包含锤子的工具箱),点击之后选择“Disconnect current device”即可。
3、自动化脚本
自动化脚本分为两种,一种是python的py格式脚本,另一种是airtest支持的air格式脚本,此处以python脚本编写自动化代码。
需要说明的是,自动化操作手机过程中,系统的屏幕旋转会被开启,同时输入法被修改为Yosemite,所以完成自动化操作之后,需要使用adb将操作修改为原始值。
from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from PIL import Image
import cv2
import time,os
import base64,io
auto_setup(__file__)
# 关闭屏幕旋转
cmd1='adb shell content insert --uri content://settings/system --bind name:s:accelerometer_rotation --bind value:i:0'
# 修改输入法到初始状态
cmd2='adb shell ime set com.baidu.input_huawei/.ImeService'
def show_info(poco):
try:
desc=poco(name='com.tencent.weishi:id/feed_desc').get_text()
author=poco(name='com.tencent.weishi:id/tv_feed_info_first_text').get_text().split()[0].replace('的视频原声','')
shares=poco(name='com.tencent.weishi:id/feed_share_text').get_text()
comments=poco(name='com.tencent.weishi:id/feed_comment_count_text').get_text()
likes=poco(name='com.tencent.weishi:id/feed_like_count').get_text()
print('desc:{0}\nauthor:{1}\tshares:{2}\tlikes:{3}\n'.format(desc,author,shares,likes))
except:
pass
def check_adb(cmd='adb devices'):
f=os.popen(cmd)
rst=f.read()
f.close()
if 'device\n' in rst:
return True
return False
def close_adb():
cmds="wmic process where name='adb.exe' call terminate"
zz=os.system(cmds)
if zz==0:
print('killed adb.')
def remove_device(cmd='adb shell settings put global adb_enabled 0'):
zz=os.system(cmd)
if zz==0:
print('device removed.')
def main(package='com.tencent.weishi'):
# 使用adb连接手机
xxx=check_adb()
if not xxx:
print('fail to start adb.exe')
return
dev1=connect_device("Android:///")
devs=device()
#start_app
# 开启微视app
start_app(package=package, activity=None)
time.sleep(3)
poco_1 = AndroidUiautomationPoco(dev1, use_airtest_input=True, screenshot_each_action=False)
time.sleep(3)
filename1='tt111.png'
# 手机截屏
a,b=poco_1.snapshot()
c=base64.b64decode(a)
tmp1=Image.open(io.BytesIO(c))
filename2='tt222.png'
tmp1.save(filename2)
# 查看分辨率
x, y = tmp1.size
print(x, y)
while 1:
try:
time.sleep(1)
# 查看当前视频的标题、分享等信息
show_info(poco_1)
time.sleep(20)
# 滑动屏幕,进入下一个视频
swipe([0.4*x,0.5*y],[0.7*x,0.3*y], duration=1)
time.sleep(1)
except KeyboardInterrupt:
break
# 关闭app
stop_app(package=package)
# 还原系统设置
os.system(cmd1)
os.system(cmd2)
time.sleep(3)
# 结束adb进程
close_adb()
time.sleep(2)
# 结束连接
remove_device()
if __name__=='__main__':
main()