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
呀,這么認真都看到這里啦,幫忙點個推薦支持一下唄,灰常感謝~