相信很多使用appium做過APP自動化的人都深有感觸:
- appium運行慢、時間長
- uiautomatorviewer定位元素時得關掉appium server
- 在低版本的appium上獲取toast需要切換automationName
現在有一款自動化測試工具uiautomator2,它幾乎完美的避免了以上的問題。簡單易學,對新手足夠友好。本次我們介紹一下這款工具,讓你在十分鍾之內能迅速掌握它
一、介紹
uiautomator2是uiautomator的升級版,uiautomator是Google開發的一款用來做安卓自動化測試的Java庫,uiautomator2則是將uiautomator中的接口封裝成了Python庫。因此它支持的語言為Python
優點主要概括如下:
- 環境搭建簡單方便
- 執行速度很快
- UI元素定位便捷好用、可視化好
- 獲取toast非常簡單
根據官方文檔,要求:
- Andorid版本 4.4+
- Python版本 3.6+
二、環境部署
1、安裝adb並配置環境變量
這里不做詳述,網上的教程很多。安裝完查看一下版本信息,能出現具體的版本號說明安裝成功
2、安裝python的uiautomator2庫
命令:
pip install -U uiautomator2
3、安裝atx-agent
這一步的目的是從github上下載atx-agent,推送到手機,作為服務端,因此先要保證adb devices能看到模擬器上的連接。這里開一台夜神模擬器作為演示
開始安裝atx-agent,命令:
python-m uiautomator2 init
安裝成功后,可以看到模擬器桌面出現一個小汽車圖標,這個就是atx.apk
4、安裝weditor
命令:
pip install -U weditor
weditor是基於瀏覽器的UI元素查看器,安裝成功后我們做個演示
在命令行輸入 weditor 會自動打開瀏覽器,在頁面上輸入模擬器的設備序列號,點擊Connect,然后點擊Dump Hierarchy刷新,可以看到模擬器的界面
打開百度貼吧,彈出隱私政策彈窗,點擊UI查看器上的刷新按鈕(當然你也可以打開實時,這樣會自動刷新),鼠標選中同意,在右邊就可以看到一些元素定位方式,如resourceId、Xpath等。是不是很方便,最方便的是它可以在運行的時候,同時開着weditor UI查看器
三、編寫百度貼吧首頁腳本
這里我們一步一步來,通過編寫百度貼吧自動化測試的用例,來說明uiautomator2這個工具提供給我們的一些方法。為了使得代碼更直觀一點,這里就不使用PO模式了,直接把每一步寫在一個模塊中
1、先創建一個工程u2-autotest,然后在其下創建一個模塊test_tieba.py
2、導入uiautomator2庫,取個別名u2,然后使用u2的connect_usb()方法連接,這個方法的參數是設備序列號(可以通過adb devices獲取)。連接成功后返回的device對象,我們取名為d,怎么檢查有沒有連接上?使用d.info能得到設備的基本信息,說明已經連接成功
3、啟動指定的app,其語法是:
d.app_start(“指定的包名”)
怎么獲取包名,可以打開app,然后打印d.info,得到的結果里的currentPackageName即是包名
4、然后點擊百度貼吧,出現的第一個頁面就是隱私政策頁,打開weditor UI查看器,刷新后鼠標移動到同意按鈕上,可以看到有兩種定位方式可選擇,一種是resourceId,一種是xpath,這里選擇resourceId
在uiautomator2里resourceId的定位方式是這樣的:
d(resourceId="元素定位表達式")
但是我們想想,能不能直接這樣寫
答案是否定的,因為啟動app后元素控件不會立即出現,因此需要等待時間,在uiautomator2中你可以用強制等待time.sleep(),也可以使用隱性等待implicitly_wait(),這和appium、selenium是一致的。
隱性等待的語法:
d.implicitly_wait(等待時長) #單位是s
整理下代碼,加上隱性等待時長10s,隱性等待只需要加一次,全局通用。
不管是等待第幾個元素,等待時長都是10s,但是如果第一個元素是2s出現,第二個元素是5s出現,那么第一個元素實際等待時長只是2s,第二個只是5s,元素出現就會進行下一步操作,而不像強制等待一直要等夠設置的時長。因此隱性等待相對比較節約時間
5、點擊同意后,我們進入滑屏頁面
滑屏操作在uiautomator2中是swipe()方法,和appium類似,sx, ex和sy,ey分別表示起點和終點的坐標
d.swipe(sx, sy, ex, ey, 0.5)
那么起點和終點的坐標如何獲取?
為了適應不同的分辨率,可以獲取到屏幕的尺寸,然后分別乘以系數。
獲取屏幕尺寸的語法是:
d.window_size()
我們看到首頁滑動屏幕需要向左滑2次,因此可以寫個for循環。這里有幾點需要注意下:
- 為了提高屏幕滑動的穩定性,需要加入強制等待,等待1s
- 滑動距離盡量大點,比如x軸起點終點可以設置系數分別為0.9, 0.1,如果你設置為0.9,0.5,很可能會出現滑動距離太小,導致沒有滑過去的情況
- uiautomator2還提供了一個擴展的滑動功能,swipe_ext(),不需要坐標,只需提供方向如"left",“right”,“up”,“down”。經過試驗,感覺不太穩定,因此還是采用常規的方法
6、滑動到最后一頁,點擊立即體驗,可以進入首頁
這里可以使用resourceId或description或xpath,這里演示一下description的使用。
在uiautomator2中description定位的語法是:
d(description="元素定位表達式")
description也稱為"content-desc",一般情況下它是唯一的
7、在首頁,可以看到左上角有關注、推薦、話題、直播四個欄目,我們選擇推薦作為斷言的元素
看到推薦有文本值,那uiautomator2支持文本作為元素定位方式嗎?
可以的
d(text="元素定位表達式")
然后可以使用get_text()方法拿到文本值,使用assert進行斷言
8、一個用例運行完之后,需要停止app並清理環境,這里使用app_stop()和app_clear()方法
d.app_stop('指定的包名') d.app_clear('指定的包名')
這時我們一個完整的用例就寫完了,當然為了演示起見,我省略了很多,比如PO模式、pytest、日志、報告等等
四、uiautomator2和appium運行速度比較
這里我更改了下代碼,使用uiautomator2和appium同時去執行百度貼吧搜索的用例,步驟一致,等待時長設置一致,看看相同的情況下哪個自動化工具更快點
事實證明,相同情況下,uiautomator2耗時1分鍾左右,而appium耗時1分鍾16s,比uiautomator2慢了約16s。當然用例越多、流程越長,效果越明顯
最后將uiautomator2的主要語法總結下,更多功能請閱讀官方文檔:http://8rr.co/Ngbk
現在就有這么一個機會,我邀請你點擊進入我們的軟件測試學習摸魚群 查看右側公告處,大家可以一起探討交流軟件測試,共同學習軟件測試技術、面試等軟件測試方方面面,還會有學習文檔資源,收獲更多測試技巧,我們一起進階Python自動化測試/測試開發,走向高薪之路。
送給大家一句話,共勉:當我們能力不足的時候,首先要做的是內修!當我們能力足夠強大的時候,就可以外尋了!