AirtestProject 令人头秃的:你的主机中的软件中止了一个已建立的连接

fishfish-yu · 2022年03月10日 · 572 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

1. 前言

最近在答疑群中,经常看到同学们遇到 你的主机中的软件中止了一个已建立的连接 这样的报错,这个报错可能的原因还挺多的,本质上是,无法连接服务。

一般来说,我们在 poco 初始化,或者是 poco 初始化之后 “第一个” 控件操作的语句中,就容易出现这个问题。

下面我们详细看下可能导致这个问题的几个常见场景:

2. 游戏应用未接入 pocoSDK

如果我们的测试应用并非 Android/iOS 原生应用,而是游戏应用,那我们在初始化该游戏应用的 poco 之前,就需要先给游戏应用接入游戏引擎对应的 PocoSDK。

成功接入 PocoSDK 并且应用打包过程无报错之后,我们可以在设备上 安装并启动 该应用,之后使用最新版的 AirtestIDE 连接该设备,在 poco 辅助窗选择正确的 poco 模式,查看能否显示正常的 UI 树。这个过程可以用来判断我们的游戏包,当前是否已经成功接入了对应的 PocoSDK。

未接入 pocoSDK 的游戏应用,我们在初始化其 poco 时,将出现下述报错:

ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。

因为此时包内没有挂载 poco 服务,我们无法与游戏建立通讯。

3. Poco 初始化顺序问题

还有一种常见的情况是,我明明已经在游戏包内接入了 pocoSDK,并且在 IDE 也可以正常看到游戏的 UI 树了,但是跑脚本的时候,却没法正常初始化 poco,或者跑到第一个 poco 语句时,就报错 你的主机中的软件中止了一个已建立的连接 ,通常是因为一些初始化的顺序问题。

其实本质问题是,我们的 pocoSDK 是接入在游戏内的,所以只有当游戏正常启动,进入到主界面之后,poco 服务才会开始起来(通常会把 poco 服务挂载到根节点,以保证游戏启动后,能尽快建立 poco 服务)。

所以我们会要求在启动游戏之后,才去查看它的 UI 树,或者初始化该游戏的 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"])

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

start_app("com.NetEase")
sleep(1.0)

poco("btn_start").click()

看起来没有很大的问题,连接设备、初始化了一个 unity poco,启动游戏,点击游戏内的控件,如果这里是 Android poco 的话,确实没有问题。

但是,我们强调过,游戏的 poco 服务是在应用里面的,我们这里没有启动游戏,也就意味着还没有启动游戏内的 poco 服务,此时强行先初始化一个 unity poco,结果就之能是收到 1 个 你的主机中的软件中止了一个已建立的连接 的报错了。

那我们把顺序调整下:

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

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

start_app("com.NetEase")
sleep(1.0)

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

poco("btn_start").click()

这下应该没问题了吧,连接设备、启动游戏应用、初始化游戏 poco,最后才进行控件操作,一切看起来都那么完美!

但是,实际运行过程,居然还是有很大概率收到 你的主机中的软件中止了一个已建立的连接 的报错,真是令人头秃!!

其实这里还有一个非常细碎的小细节需要注意下,就是我们使用 start_app 启动游戏应用,大部分游戏,启动到进入主界面时,也就是完全启动游戏,是需要一定时间的,可能是 5s,可能是 10s,这个跟设备和具体的游戏应用,都有关系,而在游戏没有完全启动时,里面的 poco 服务也没办法跟着起来,这就导致还有很大的概率出现报错了。

所以我们尽量在 start_app 之后,增加尽可能长一点的 sleep ,以确保游戏完成启动,再来初始化我们的游戏 poco,同理,poco 初始化语句之后,也可以适当的添加一点 sleep,来保证 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"])

start_app("com.NetEase")
sleep(6.0)

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

poco("btn_start").click()

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

4. 初始化远程 iOS 设备的 poco 问题

目前,我们仅支持初始化本地连接的 iOS 设备的 poco(查看本地连接 iOS 设备的 UI 树),不支持初始化远程连接的 iOS 的 poco。

强行初始化远程 iOS 设备的 poco 时,也将无法成功连接上服务。

5. Windows 游戏的 poco 初始化问题

以 Windows 上的 unity 游戏为例,当我们在该客户端游戏上成功接入 pocoSDK 之后,我们支持在该 Windows 游戏上使用 poco。

但是它的初始化脚本,与 Android 设备的 unity poco,又有一些不一样:

# Android设备上的unity poco初始化
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()

# Windows上的unity poco初始化
dev = connect_device('Windows:///?title_re=^your game title.*$')

addr = ('', 5001)
poco = UnityPoco(addr, device=dev)

如果我们在 Windows 的 unity 游戏上,使用 Android 的初始化方式,也会导致无法连接服务,从而产生 你的主机中的软件中止了一个已建立的连接 的报错。

6. 连线不稳定的问题

也有少部分情况是,数据线连线不稳定的问题,导致连接暂时断了一下。如果我们在跑脚本的时候,发现一些不固定位置的偶现断开连接的报错,可以考虑是数据线连线不稳定的问题,请及时更换稳定的数据线,再来进行脚本跑测。

7. 其它问题

除了上述问题以外,可能还有一些别的问题,我们这里没有讲到;同学们在遇到该问题时,优先排除以上几个问题,若仍无法解决,请整理详细的复现情况给到我们开发组排查:https://airtest.netease.com/issue_create


Airtest 官网https://airtest.netease.com/
Airtest 教程官网https://airtest.doc.io.netease.com/
搭建企业私有云服务https://airlab.163.com/b2b

官方答疑 Q 群:117973773

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册