欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

手机app自动化操作工具airtest之入门篇

程序员文章站 2022-04-11 10:22:40
...

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 即可。
手机app自动化操作工具airtest之入门篇
之后会出现手机画面:

手机app自动化操作工具airtest之入门篇
对于出现的手机画面,使用鼠标进行点击和滑动,可以达到 操作手机的效果。

软件左下角处“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()