Skip to content

五、不同平台的Poco初始化脚本

1. 前言

我们都知道,Poco是一个跨平台的自动化测试框架,在不同平台,比如Android、iOS、unity引擎下,我们需要初始化不一样的Poco,才能对对应平台的控件进行操作。

本文将详细讲述各个平台下的Poco初始化脚本的注意事项。

2. Android平台的Poco初始化

1)单台Android设备

在进行Android平台的Poco初始化之前,我们需要确保当前已经连接好了1台/多台正常启动的Android设备:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)

poco(text="网易云音乐").click()

2)多台Android设备

如果是初始化多台Android设备的Poco,我们需要分开进行初始化:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555","android://127.0.0.1:5037/0123456789"])

from airtest.core.android import Android
dev1 = Android('127.0.0.1:7555')
dev2 = Android('0123456789')

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco1 = AndroidUiautomationPoco(dev1)
poco2 = AndroidUiautomationPoco(dev2)

poco1(text="网易云音乐").click()
poco2(text="网易云音乐").click()

3. iOS平台的Poco初始化

与Android设备的Poco初始化类似,我们在初始化iOS Poco之前,需要确保我们已经连接了这台iOS设备:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__)

connect_device("iOS:///http://127.0.0.1:8100")

from poco.drivers.ios import iosPoco
poco = iosPoco()

1)先连设备,再初始化Poco

如果我们在连接iOS设备之前,就进行iOS Poco的初始化,会报please call connect_device to connect an ios device first的错误:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__)

# 错误示范!!!
from poco.drivers.ios import iosPoco
poco = iosPoco()

connect_device("iOS:///http://127.0.0.1:8100")

image-20211125175945938

4. unity项目的Poco初始化

1)Android/iOS设备上的unity游戏

在对Android/iOS设备上的unity游戏应用进行Poco初始化之前,请务必确保它已经事先接入了Poco-SDK。如果我们已经在游戏里正确接入了Poco-SDK,那么游戏启动后,Poco服务也会启动,所以我们要确保在游戏完全启动之后,再来进行unity Poco的初始化:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__)

# 完全启动游戏
start_app("com.NetEase")
sleep(3.0) # sleep一定时间以确保游戏完全启动

from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()

很多同学在编写游戏应用的Poco初始化脚本时,容易把连接设备、初始化poco和打开应用的脚本顺序搞乱,导致出现一大堆奇妙的报错。

比如大家最常见的:“远程主机强迫关闭了一个现有的连接”“socket connection broken” 等等。

正确的顺序是:先连接设备(一般在 auto_setup 接口里面连接)--> 再打开应用(一般用 start_app 接口)--> 等应用开启完毕,最后才初始化 poco

2)Windows上的unity游戏

在Windows平台上运行的unity游戏(事先接入了Poco-SDK),我们可以通过下述方式初始化它的Poco:

from poco.drivers.unity3d import UnityPoco
from airtest.core.api import connect_device

# 使用正则表达式匹配Windows窗口
dev = connect_device('Windows:///?title_re=^your game title.*$')

# make sure your poco-sdk in the game runtime listens on the following port.
# default value will be 5001
# IP is not used for now
addr = ('', 5001)

# 指定设备对象初始化unity poco
poco = UnityPoco(addr, device=dev)

ui = poco('...')
ui.click()

3)Windows上的UnityEditor

Poco也支持直接连接UnityEditor来进行调试,初始化Poco的方式如下(请确保游戏项目已接入Poco-SDK,并且游戏已正常启动):

from poco.drivers.unity3d import UnityPoco
from poco.drivers.unity3d.device import UnityEditorWindow

# specify to work on UnityEditor in this way
dev = UnityEditorWindow()

# make sure your poco-sdk component listens on the following port.
# default value will be 5001. change to any other if your like.
# IP is not used for now
addr = ('', 5001)

# 指定设备对象初始化unity poco
poco = UnityPoco(addr, device=dev)

ui = poco('...')
ui.click()

4)多设备的unity项目Poco初始化

如果同学们连接了多台设备/多种设备对象,我们需要给每个设备的unity项目都初始化一个Poco(每个设备上的unity项目均已接入Poco-SDK,并且unity游戏已经启动):

from poco.drivers.unity3d import UnityPoco
from poco.drivers.unity3d.device import UnityEditorWindow

# initialize different device object one by one
dev1 = UnityEditorWindow()
dev2 = connect_device('Android:///')
dev3 = connect_device('Windows:///?title_re=^title xxx.*$')

# use this default address. separate them if the devices do not listens on the same port.
addr = ('', 5001)

# initialize poco instance one by one by specifying different device object
poco1 = UnityPoco(addr, device=dev1)
poco2 = UnityPoco(addr, device=dev2)
poco3 = UnityPoco(addr, device=dev3)

ui1 = poco1('...')
ui1.click()
ui2 = poco2('...')
ui2.swipe('up')

5. cocos2dx-lua项目的Poco初始化

我们在cocos2dx-lua项目中接入Poco-SDK之后,通常会打出Android包来进行测试,在Android设备上启动游戏之后,初始化方法如下:

from poco.drivers.std import StdPoco
poco = StdPoco()

# 或者传入指定的设备对象
from poco.drivers.std import StdPoco
from airtest.core.api import connect_device

device = connect_device('Android:///')
poco = StdPoco(10054, device)

ui = poco('...')
ui.click()

6. cocos2dx-js项目的Poco初始化

同cocos2dx-lua项目,在Android设备上启动接好Poco-SDK的cocos2dx-js游戏之后,我们就可以通过下述方式初始化Poco:

from poco.drivers.cocosjs import CocosJsPoco
poco = CocosJsPoco()

7. Egret项目的Poco初始化

1)连接手机浏览器

环境配置好之后,我们在手机浏览器上打开Egret页面(或者微信小程序/游戏),就可以通过下述方式初始化Poco:

from poco.drivers.std import StdPoco
from poco.utils.device import VirtualDevice
poco = StdPoco(15004, VirtualDevice('localhost'))

2)连接Windows桌面浏览器

同上,环境配置好并且连接上桌面浏览器之后,就可以通过下述方式初始化Poco:

from poco.drivers.std import StdPoco
poco = StdPoco()

8. UE4项目的Poco初始化

确保已经连接设备,并且启动UE4项目(事先接入了Poco-SDK)之后,我们可以通过下述方式初始化Poco:

from poco.drivers.ue4 import UE4Poco
poco = UE4Poco()

# example
poco("StartButton").click()