五、不同平台的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")
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()