Airtest API精讲之设备连接管理API集合

上期回顾:Airtest通过代码生成报告——simple_report、LogToHtml详解


20242.25更新:Airtest1.3.1连接符可通过name参数指定手机UDID,见文末

 

以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85

之前我们讲了airtest run命令行运行命令,其中有个device参数,只要输入设备的URI,会自动帮我们连接设备。那么今天就来讲一讲不通过命令行运行,在脚本中如何连接、操作设备。

相关的API有:

auto_setup(),connect_device(),init_device(),device(),set_current(),cli_setup()

auto_setup()

这个函数我们在IDE中新建文件的时候,都会自动帮我们写上。它是用来帮我们做初始化的,可以设置脚本路径、连接设备、log路径、项目根目录、截图精度。

# 文件位置:your_python_path/site-packages/airtest/core/api.py
def auto_setup(basedir=None, devices=None, logdir=None, project_root=None, compress=None):
    if basedir:
        if os.path.isfile(basedir):
            basedir = os.path.dirname(basedir)
        if basedir not in G.BASEDIR:
            G.BASEDIR.append(basedir)
    if devices:
        for dev in devices:
            connect_device(dev)
    if logdir:
        logdir = script_log_dir(basedir, logdir)
        set_logdir(logdir)
    if project_root:
        ST.PROJECT_ROOT = project_root
    if compress:
        ST.SNAPSHOT_QUALITY = compress

参数说明:

  • basedir:当前脚本路径,默认为None,可设置为__file__

  • devices:字符串列表[],里面放设备URI字符,之前Airtest命令行运行airtest run详解 中的--device参数解释有各平台的示例。因为是列表,所以你可以传入2个URI,这样将连接两台设备

  • logdir:日志存放路径。默认为None表示不保存日志;可指定路径字符串;也可设置为True,则自动设置路径为<basedir>/log

  • project_root:项目根目录,用于赋值给全局设置ST.PROJECT_ROOT,方便using()接口的调用

  • compress:截图精度,1-100;默认值为None时精度是10

源码解析:

  1. 第1个if,将脚本路径保存在全局变量G.BASEDIR中

  2. 第2个if,依次用connect_device()连接设备URI

  3. 第3个if,设置日志存放路径

  4. 第4个if,将项目根目录保存在全局设置ST.PROJECT_ROOT

  5. 第5个if,将截图精度保存在全局设置ST.SNAPSHOT_QUALITY,ST.SNAPSHOT_QUALITY的默认值是10

可以看到auto_setup()连接设备其实就是调用的connect_device()

演示实例

__author__ = '公众号:测试工程师小站'

# 连接模拟器
auto_setup(__file__, devices=["android://127.0.0.1:5037/emulator-5554?cap_method=JAVACAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH"], 
logdir=True, project_root=r"D:\qasite", compress=90)

connect_device()

# 文件位置:your_python_path/site-packages/airtest/core/api.py
def connect_device(uri):
    d = urlparse(uri)
    platform = d.scheme
    host = d.netloc
    uuid = d.path.lstrip("/")
    params = dict(parse_qsl(d.query))
    if host:
        params["host"] = host.split(":")
    dev = init_device(platform, uuid, **params)
    return dev

参数说明:

  • uri:设备连接字符串

源码解析:
前面的语句就是各种解析URI,拆解出各部分并存入相应变量。核心就是调用了init_device()初始化设备。

演示实例

__author__ = '公众号:测试工程师小站'

# 连接默认的一台安卓设备
connect_device("Android:///")

# 连接指定devid安卓设备
connect_device("Android:///65fade15")

# 连接iOS设备(通过tidevice连接,详情可以查阅之前的文章)
connect_device("ios:///http+usbmux://07bbb06a267ee")

# 通过官方的iOS_target连接iOS设备
connect_device("iOS:///127.0.0.1:8100")
# iOS with mjpeg port
connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100")
# iOS with mjpeg port and udid
connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&udid=00008020-001270842E88002E")
# udid/uuid/serialno are all ok
connect_device("iOS:///http://localhost:8100/?mjpeg_port=9100&&uuid=00008020-001270842E88002E")

# 连接Windows窗口
connect_device("Windows:///?title_re=.*记事本.*")

# 连接模拟器
connect_device("Android://127.0.0.1:5037/127.0.0.1:62001?cap_method=JAVACAP&&ori_method=ADBORI")

# 连接多台设备
dev1 = connect_device("Android://127.0.0.1:5037/serialno1")  # 连上第一台手机
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")  # 连上第二台手机
set_current("serialno2")  # 切换当前手机为serialno2的手机

init_device()

# 文件位置:your_python_path/site-packages/airtest/core/api.py
def init_device(platform="Android", uuid=None, **kwargs):
    cls = import_device_cls(platform)
    dev = cls(uuid, **kwargs)
    # Add device instance in G and set as current device.
    G.add_device(dev)
    return dev

参数说明:

  • platform:Android, IOS or Windows

  • uuid:Android的序列号(adb deivces), Windows的窗口句柄, iOS的uuid(tidevice list)

  • **kwargs:可选的平台相关参数,如安卓的cap_method=JAVACAP

源码解析:
第1行,确定要初始化的类,摘取部分import_device_cls()源码,主要就是这3个平台的类

    elif platform == "android":
        from airtest.core.android.android import Android as cls
    elif platform == "windows":
        from airtest.core.win.win import Windows as cls
    elif platform == "ios":
        from airtest.core.ios import IOS as cls

第2行,实例化一个设备
第3行,将实例化的设备添加到全局设备列表中(G.DEVICE_LIST),并设置为当前使用设备(G.DEVICE)

device()

获取当前设备,很简单,源码就一行return G.DEVICE
有了设备变量后,我们就可以使用各种Airtest API了,如

dev = device()
dev.touch((100, 100))

set_current()

上面讲auto_setup()和connect_device()时都有提到,我们可以初始化两台设备,但同一时间,只有一台设备是激活状态可操作的。所以操作完一台后,我们要切换到第2台去操作,就可以用set_current()

__author__ = '公众号:测试工程师小站'

from airtest.core.api import *

# 初始化2台设备,用auto_setup()或connect_device()都可以
# auto_setup(__file__, devices=["android:///serialno1","android:///serialno2"], logdir=True)
# 或
dev1 = connect_device("Android://127.0.0.1:5037/serialno1")
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")

# 通过序列号切到手机1
set_current("serialno1")

# 打开微信A,添加微信B好友(代码略)

# 通过序列号切到手机2
set_current("serialno2")

# 打开微信B,同意微信A好友申请(代码略)

# 通过设备列表索引切到手机1
set_current(0)

# 在微信A,向微信B发消息(代码略)

# 通过设备列表索引切到手机2
set_current(1)

# 在微信B,断言收到微信A的消息(代码略)

注意:使用set_current()后,一定要加比较长的等待,如sleep(10),因为底层的一系列切换操作比较慢,不加等待会导致运行失败。

cli_setup()

在IDE新建 .py 脚本时,会自动在脚本中插入如下的代码

__author__ = '公众号:测试工程师小站'

from airtest.core.api import *
from airtest.cli.parser import cli_setup

if not cli_setup():
    auto_setup(__file__, logdir=True, devices=["Android:///",])

cli_setup()的作用就是脚本运行后判断是不是通过命令行运行的,如果不是,则运行auto_setup()来初始化设备等,如果是,则通过命令中的参数初始化。
这样,此脚本既可以直接在AirtestIDE或Pycharm运行,也可以通过airtest命令行运行了。

 

Airtest1.3.1连接符可指定手机UDID

以上所有的方法,在Airtest1.3.1时,支持可在连接符通过name参数指定手机UDID

# iOS设备 ios:///http://10.240.145.171:20092?name=83282c400efc9122e3bcba60c803cf318a6b3822

# 安卓远程设备 android://127.0.0.1:5037/10.227.71.86:20029?name=serialno

---------------------------------------------------------------------------------

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

posted @ 2022-02-05 09:32  ☆星空物语☆  阅读(531)  评论(0编辑  收藏  举报