十分鍾弄懂最快的APP自動化工具uiautomator2


相信很多使用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自動化測試/測試開發,走向高薪之路。

送給大家一句話,共勉:當我們能力不足的時候,首先要做的是內修!當我們能力足夠強大的時候,就可以外尋了! 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM