令人頭禿的:你的主機中的軟件中止了一個已建立的連接

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

呀,這麼認真都看到這裏啦,幫忙點個推薦支持一下唄,灰常感謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章