淺談自動化測試工具-WEditor
簡單介紹
python-uiautomator2是一個自動化測試開源工具,僅支援Android平臺的原生應用測試。
支援平臺及語言
python-uiautomator2封裝了谷歌自帶的uiautomator2測試框架,提供便利的python介面。他允許測試人員直接在PC上編寫Python的測試程式碼,操作手機應用,完成自動化,大大提高了自動化程式碼編寫的效率。
工作原理
如圖所示,python-uiautomator2主要分為兩個部分,python客戶端,移動裝置
- python端: 執行指令碼,並向移動裝置傳送HTTP請求
- 移動裝置:移動裝置上運行了封裝了uiautomator2的HTTP服務,解析收到的請求,並轉化成uiautomator2的程式碼。
整個過程
- 在移動裝置上安裝
atx-agent
(守護程序), 隨後atx-agent
啟動uiautomator2服務(預設7912埠)進行監聽 - 在PC上編寫測試指令碼並執行(相當於傳送HTTP請求到移動裝置的server端)
- 移動裝置通過WIFI或USB接收到PC上發來的HTTP請求,執行制定的操作
安裝工具
- Python2或者Python3均可。(也可以嘗試使用Android上Python客戶端:QPython)
- 移動裝置
環境搭建
安裝adb
安裝python-uiautomator2
pip install --pre -U uiautomator2
裝置安裝atx-agent
首先裝置連線到PC,並能夠adb devices
發現該裝置。
# 從github下載atx-agent檔案,並推送到手機。在手機上安裝包名為`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
最後提示success,代表atx-agent初始化成功。
應用及操作
呼叫uiautomator2的過程
- 配置手機裝置引數,設定具體操作的是哪一臺手機
- 抓取手機上應用的控制元件,制定對應的控制元件來進行操作
- 對抓取到的控制元件進行操作,比如點選、填寫引數等。
配置手機裝置引數
python-uiautomator2連線手機的方式有兩種,一種是通過WIFI,另外一種是通過USB。兩種方法各有優缺點。
WIFI最便利的地方要數可以不用連線資料線,USB則可以用在PC和手機網路不在一個網段用不了的情況。
-
使用WIFI連線
手機獲取到手機的IP,並確保電腦可以PING通手機。手機的IP可以在設定-WIFI設定裡面獲取到。
比如手機的IP是192.168.0.100
,連線裝置的程式碼為import uiautomator2 as u2 d = u2.connect('192.168.0.100')
-
使用USB連線
手機的序列號可以通過
adb devices
獲取到,假設序列號是123456f
,連線程式碼為import uiautomator2 as u2 d = u2.connect_usb('123456f')
抓取手機上應用的控制元件
雖然很想用Android SDK內建工具uiautomatorviewer.bat
,但是執行uiautomator2的時候,uiautomatorviewer.bat
執行不起來,兩者之間衝突太嚴重。
於是參考著uiautomatorviewer
的介面,我又寫了一個weditor
,呼叫python-uiautomator2的兩個介面screenshot
和dump_hierarchy
這樣就不會有衝突問題了
注:weditor依然處於開發期,功能可能會跟文中描述的有所不同
安裝方法: pip install --pre weditor
使用方法:
首先執行python -m weditor
,之後瀏覽器會自動開啟一個網頁 http://atx.open.netease.com
(注:這個網址僅提供一個前端,而python -mweditor
這個命令則本地開放了HTTP的介面,前端去跟本地的服務去通訊)
下圖為網頁的截圖
重點說下這個部分
先忽略iOS
和Neco
這兩個,直接選擇Android。輸入框中可以寫裝置的IP或者裝置的Serial(序列號),跟上面提到的配置手機裝置引數用法一致。之後點選Connect,如果一切正常就會出現一個綠色的葉子。
頁面重新整理時,點選藍色的Reload按鈕重新重新整理。
定位方式
- ResourceId定位:
d(resourceId="com.smartisanos.clock:id/text_stopwatch").click()
- Text定位
d(text="秒錶").click()
- Description定位
d(description="..").click()
- ClassName定位
d(className="android.widget.TextView").click()
還有太多太多的操作,我就不寫了。更多更詳細的API介面文件,直接去Github上看文件吧,