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

1. 前言

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

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

2. Android平台的Poco初始化

1)单台Android设备

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

  1. # -*- encoding=utf8 -*-
  2. __author__ = "AirtestProject"
  3. from airtest.core.api import *
  4. auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555"])
  5. from poco.drivers.android.uiautomation import AndroidUiautomationPoco
  6. poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
  7. poco(text="网易云音乐").click()

2)多台Android设备

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

  1. # -*- encoding=utf8 -*-
  2. __author__ = "AirtestProject"
  3. from airtest.core.api import *
  4. auto_setup(__file__,devices=["android://127.0.0.1:5037/127.0.0.1:7555","android://127.0.0.1:5037/0123456789"])
  5. from airtest.core.android import Android
  6. dev1 = Android('127.0.0.1:7555')
  7. dev2 = Android('0123456789')
  8. from poco.drivers.android.uiautomation import AndroidUiautomationPoco
  9. poco1 = AndroidUiautomationPoco(dev1)
  10. poco2 = AndroidUiautomationPoco(dev2)
  11. poco1(text="网易云音乐").click()
  12. poco2(text="网易云音乐").click()

3. iOS平台的Poco初始化

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

  1. # -*- encoding=utf8 -*-
  2. __author__ = "AirtestProject"
  3. from airtest.core.api import *
  4. auto_setup(__file__)
  5. connect_device("iOS:///http://127.0.0.1:8100")
  6. from poco.drivers.ios import iosPoco
  7. poco = iosPoco()

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

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

  1. # -*- encoding=utf8 -*-
  2. __author__ = "AirtestProject"
  3. from airtest.core.api import *
  4. auto_setup(__file__)
  5. # 错误示范!!!
  6. from poco.drivers.ios import iosPoco
  7. poco = iosPoco()
  8. 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的初始化:

  1. # -*- encoding=utf8 -*-
  2. __author__ = "AirtestProject"
  3. from airtest.core.api import *
  4. auto_setup(__file__)
  5. # 完全启动游戏
  6. start_app("com.NetEase")
  7. sleep(3.0) # sleep一定时间以确保游戏完全启动
  8. from poco.drivers.unity3d import UnityPoco
  9. poco = UnityPoco()

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

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

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

2)Windows上的unity游戏

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

  1. from poco.drivers.unity3d import UnityPoco
  2. from airtest.core.api import connect_device
  3. # 使用正则表达式匹配Windows窗口
  4. dev = connect_device('Windows:///?title_re=^your game title.*$')
  5. # make sure your poco-sdk in the game runtime listens on the following port.
  6. # default value will be 5001
  7. # IP is not used for now
  8. addr = ('', 5001)
  9. # 指定设备对象初始化unity poco
  10. poco = UnityPoco(addr, device=dev)
  11. ui = poco('...')
  12. ui.click()

3)Windows上的UnityEditor

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

  1. from poco.drivers.unity3d import UnityPoco
  2. from poco.drivers.unity3d.device import UnityEditorWindow
  3. # specify to work on UnityEditor in this way
  4. dev = UnityEditorWindow()
  5. # make sure your poco-sdk component listens on the following port.
  6. # default value will be 5001. change to any other if your like.
  7. # IP is not used for now
  8. addr = ('', 5001)
  9. # 指定设备对象初始化unity poco
  10. poco = UnityPoco(addr, device=dev)
  11. ui = poco('...')
  12. ui.click()

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

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

  1. from poco.drivers.unity3d import UnityPoco
  2. from poco.drivers.unity3d.device import UnityEditorWindow
  3. # initialize different device object one by one
  4. dev1 = UnityEditorWindow()
  5. dev2 = connect_device('Android:///')
  6. dev3 = connect_device('Windows:///?title_re=^title xxx.*$')
  7. # use this default address. separate them if the devices do not listens on the same port.
  8. addr = ('', 5001)
  9. # initialize poco instance one by one by specifying different device object
  10. poco1 = UnityPoco(addr, device=dev1)
  11. poco2 = UnityPoco(addr, device=dev2)
  12. poco3 = UnityPoco(addr, device=dev3)
  13. ui1 = poco1('...')
  14. ui1.click()
  15. ui2 = poco2('...')
  16. ui2.swipe('up')

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

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

  1. from poco.drivers.std import StdPoco
  2. poco = StdPoco()
  3. # 或者传入指定的设备对象
  4. from poco.drivers.std import StdPoco
  5. from airtest.core.api import connect_device
  6. device = connect_device('Android:///')
  7. poco = StdPoco(10054, device)
  8. ui = poco('...')
  9. ui.click()

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

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

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

7. Egret项目的Poco初始化

1)连接手机浏览器

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

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

2)连接Windows桌面浏览器

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

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

8. UE4项目的Poco初始化

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

  1. from poco.drivers.ue4 import UE4Poco
  2. poco = UE4Poco()
  3. # example
  4. poco("StartButton").click()