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


此文章來源於項目官方公眾號:“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 UnityPocopoco = 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 UnityPocopoco = 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 UnityPocopoco = 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 UnityPocopoco = UnityPoco()# Windows上的unity poco初始化dev = connect_device('Windows:///" >6. 連線不穩定的問題 

也有少部分情況是,數據線連線不穩定的問題,導致連接暫時斷瞭一下。如果我們在跑腳本的時候,發現一些不固定位置的偶現斷開連接的報錯,可以考慮是數據線連線不穩定的問題,請及時更換穩定的數據線,再來進行腳本跑測。

7. 其它問題

除瞭上述問題以外,可能還有一些別的問題,我們這裡沒有講到;同學們在遇到該問題時,優先排除以上幾個問題,若仍無法解決,請整理詳細的復現情況給到我們開發組排查:https://airtest.netease.com/issue_create 。


Airtest 官網:http://airtest.netease.com/
Airtest 教程官網:https://airtest.doc.io.netease.com/
搭建企業私有雲服務:https://airlab.163.com/b2b

官方答疑 Q 群:117973773

呀,這麼認真都看到這裡啦,幫忙點個贊或者收藏支持下我把,灰常感謝~

本文來自網絡,不代表程式碼花園立場,如有侵權,請聯系管理員。https://www.codegarden.cn/article/31302/