以下基於
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
今天來說說使用Airtest和Poco框架時常見的Exception,方便以後大家排查問題。
首先我們來看看一個報錯長什麼樣子
Traceback (most recent call last):
File "D:/code/Airtest/airtest_1/airtest_python.py", line 17, in <module>
connect_device("Android://127.0.0.1:5037/1ae7be68")
File "D:\soft\Miniconda2\envs\py38\lib\site-packages\airtest\core\api.py", line 68, in connect_device
dev = init_device(platform, uuid, **params)
File "D:\soft\Miniconda2\envs\py38\lib\site-packages\airtest\core\api.py", line 37, in init_device
dev = cls(uuid, **kwargs)
File "D:\soft\Miniconda2\envs\py38\lib\site-packages\airtest\core\android\android.py", line 46, in __init__
self.adb.wait_for_device()
File "D:\soft\Miniconda2\envs\py38\lib\site-packages\airtest\core\android\adb.py", line 303, in wait_for_device
raisefrom(DeviceConnectionError, "device not ready", e)
File "D:\soft\Miniconda2\envs\py38\lib\site-packages\airtest\utils\compat.py", line 55, in raisefrom
raise_from(exc_type(message), exc)
File "<string>", line 3, in raise_from
airtest.core.error.DeviceConnectionError: 'device not ready'
最上面的第2、3行
File "D:/code/Airtest/airtest_1/airtest_python.py", line 17, in <module>
connect_device("Android://127.0.0.1:5037/1ae7be68")
顯示本次運行的.py文件,以及是在該文件17行的connect_device
最先出現的錯誤
之後下面每一個File就是最上面那個報錯文件依次調用的地方
最後一行
airtest.core.error.DeviceConnectionError: 'device not ready'
表示這個報錯類型是DeviceConnectionError
,從字面理解就是設備連接錯誤
報錯描述device not ready
報錯的路徑是airtest.core.error
我們需要關心的就是報錯類型和報錯描述了,一般情況下看這2個基本就能明白大概是什麼原因導致的報錯,再結果代碼上下文就可以Debug了。
擴展閱讀:Python 異常處理
下面不再具體給出報錯堆棧例子,只講報錯類型,大家以後遇到問題對號入座即可。
Airtest框架
DeviceConnectionError
因爲設備連接符寫錯、設備物理連不上等原因導致的設備連接問題,都會報這個錯。
TargetNotFoundError
Airtest框架最常見的一個了,圖片找不到的時候,就會報這個錯誤。
最常見的兩個原因:一個是頁面(畫面)出現太慢或太快,導致去查找的時候確實沒有;一個是圖像存在,但threshold閾值不達標。
AdbError
ADB命令執行時出錯。Android很多API底層其實是基於ADB實現的,所以不要疑惑你沒調用ADB,可能Airtest底層調用了。
AdbShellError
adb shell命令執行時出錯。ADB有些命令是要進入adb shell才能執行的。
擴展閱讀:ADB命令大全
ScreenError
截屏時可能會出現的錯誤
MinicapError
安卓底層Minicap相關報錯
擴展閱讀:Airtest源碼分析--Android屏幕截圖方式
MinitouchError
安卓底層Minitouch相關報錯
Poco框架
InvalidOperationException
無效操作時出現的報錯,比如一個長列表,末尾的元素在屏幕外,你卻要點擊;又或者一個圖片元素,你卻當輸入框去設置它沒有的text屬性。
PocoNoSuchNodeException
元素不存在的報錯,比如你把元素屬性寫錯了,肯定找不着;或者是頁面(畫面)出現太慢或太快,導致你要操作的元素當時未找到。避免這個問題的最好辦法就是先等待元素出現了,再去操作
擴展閱讀:Poco API精講之 等待 wait
PocoTargetTimeout
等待元素超時,這個異常只會在你主動等待元素出現或消失時拋出,和PocoNoSuchNodeException
不一樣,當你的操作速度太快,界面來不及跟着變化的話,你只會遇到PocoNoSuchNodeException
而不是PocoTargetTimeout
總結:PocoTargetTimeout
是等待時元素不存在的報錯;PocoNoSuchNodeException
是操作時元素不存在的報錯
PocoTargetRemovedException
操作元素時元素被移除的報錯。上面我們說了,操作元素時最好先等待,再操作。但偶爾會出現你等待的時候它在,等你要去操作的一瞬間,它沒了,就會報這個錯。
---------------------------------------------------------------------------------
關注微信公衆號即可在手機上查閱,並可接收更多測試分享~