如何生成高效、兼容性好的Poco定位腳本

1. 前言

很多新手同學在學習Poco測試框架的時候,會經常遇到一些關於控件定位腳本的問題。比如,上一秒還能正常運行的控件定位腳本,下一秒就報錯找不到控件了;再比如,明明不同手機上裝的都是同一款應用,但就是有些手機報找不到控件......

這一種種“詭異”的情況,都讓我們百思不得其解。所以今天的推文內容,我們將詳細地跟大家分享下在編寫Poco定位腳本時,我們可以用到的一些實用技巧,超長乾貨,同學們一定要mark住哦!

2. 生成Poco定位腳本的多種方式

在瞭解Poco定位腳本的編寫技巧之前,我們先來細細回顧一下,我們可以通過哪些方式來“生成”1條Poco定位腳本。

1)單步錄製-雙擊節點

在AirtestIDE連接上設備之後,打開待測應用,隨後在IDE的Poco輔助窗中選擇對應的Poco模式,等待UI樹刷新出來:

利用檢索按鈕檢索到目標控件之後,雙擊 UI樹上的該節點,IDE即可幫助我們自動在腳本編輯窗裏面自動生成1條控件定位腳本:

2)單步錄製-右鍵選擇UI path code

同上,在IDE的Poco輔助窗刷新出控件樹之後,單擊選中我們的目標節點,然後單擊鼠標右鍵,選擇 UI path code,IDE的腳本編寫窗口就會自動幫我們生成1條控件定位腳本:

3)自動錄製

另外,IDE還提供像錄製Airtest腳本一樣的,自動錄製Poco腳本的功能:

單擊Poco輔助窗的錄製功能,然後隨着我們對設備畫面的操作,IDE會自動在腳本編寫窗口錄製下來我們的Poco操作腳本。

4)手動編寫-根據3種定位選擇器

除了使用IDE給我們提供的各種錄製方式之外,我們還可以根據各種控件定位規則,手動編寫Poco定位腳本。

Poco給我們提供了3種定位選擇器,分別是:

  • 基本選擇器:根據控件的屬性和屬性值來進行定位,常見的比如name屬性、text屬性等
  • 相對選擇器:根據控件之間的渲染層級關係來進行定位,常見的關係比如父子關係、兄弟關係等
  • 空間順序選擇器:按照控件的空間排布順序,從左到右,從上到下,添加索引值來進行控件定位

我們在定位腳本時,可以僅僅使用其中一種定位選擇器,也可以混合使用多種定位選擇器來編寫控件的定位腳本,詳細的介紹可以查看我們的往期推文 poco的元素定位搞不定?速來看看這3個選擇器

下面我們提供一些利用這3種選擇器進行示例腳本:

# 使用基本選擇器的poco定位腳本
poco(text="每日推薦")

# 使用相對選擇器的poco定位腳本
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/swipeToRefreshView").child("com.netease.cloudmusic:id/recyclerView")

# 使用控件順序選擇器的poco定位腳本
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/swipeToRefreshView").child("com.netease.cloudmusic:id/recyclerView")[0]
5)手動編寫-根據正則匹配表達式

除了上述3種定位選擇器之外,我們還支持使用正則匹配表達式來匹配我們的Poco控件。

在部分情況下,使用正則匹配表達式來匹配Poco控件,會使得我們的定位腳本更加簡潔省事。

這裏簡單列舉幾個使用正則表達式匹配控件的腳本:

# 匹配控件的name屬性
poco(nameMatches="com.*?songInfo")

# 匹配控件的text屬性
poco(textMatches=".*淘寶")

關於利用正則匹配表達式來匹配控件的詳細內容,也可以參考我們的往期推文 真香系列!用正則表達式匹配poco控件,學會了秒殺各種定位選擇器

其中我們需要記住的最重要的一點是:只要能夠用 poco(xx=預期屬性值) 來選擇的控件,就可以用 poco(xxMatches=預期屬性值的正則表達式) 來進行匹配定位。常見的如常 textMatchesnameMatchestypeMatches等等。

3. 生成高效、兼容性好的Poco腳本技巧

那簡單瞭解完“生產”Poco定位腳本的各種方式之後,我們再來聊一聊其中的一些技巧。

1)儘量不要完全依賴自動錄製

儘管我們的IDE提供了自動錄製Poco腳本的功能,但是我們還是希望同學們不要過於依賴自動錄製出來的Poco腳本。

我們更建議大家在學習Poco腳本的初期使用這個功能,來更好的熟悉我們的Poco腳本長什麼樣子,把錄製的腳本作爲參考。

這是因爲自動錄製的Poco腳本,並不完全是正確的、或者是優秀的Poco腳本,有時候我們錄製下來的Poco腳本並不能成功回放出來我們期望的效果,或者因爲層級過於複雜導致運行效率很低。

舉個例子:

poco(text="每日推薦").click()
poco("android.widget.LinearLayout").offspring("com.netease.cloudmusic:id/daily_rv").child("com.netease.cloudmusic:id/musicListItemContainer")[0].child("com.netease.cloudmusic:id/songItemVideoBtn").click()
poco("轉到上一層級").click()

這3條是自動錄製出來的Poco腳本,我們可以對每一條簡單分析下:

① 第一條就是很標準的利用text屬性進行定位的腳本,沒什麼疑問,只要text屬性在當前頁面是唯一的,那就沒有很大的問題;

② 第二條就是非常典型的,錄製出來的層級過於複雜的腳本,這裏涉及了三四層的相對關係,還帶有空間索引,很容易出現運行效率差,或者因爲索引值變化而導致出現找不到控件的問題;這種定位腳本我們使用過程就需要慎重考慮了,最好更換成別的更加簡潔清爽的定位方式;

③ 第三條是錄製出來的一個返回上一個頁面的Poco定位腳本,這種情況更好的方式是不使用Poco定位腳本,替換成 keyevent("BACK") ,更加簡單而且穩定。

我們列舉這個例子,就是爲了說明,錄製功能雖然很“小白”,但是我們還可以將錄製出來的Poco腳本優化成更加優秀的腳本,所以同學們不要過去依賴這個錄製功能。

2)減少使用UI path code方式單步錄製的腳本(效率低、易出錯)

上文我們介紹瞭如何在IDE中右鍵單擊UI樹的控件,然後選擇 UI path code 來生成1條控件定位腳本,但其實,我們並不是非常建議這種方式生成的定位腳本。

舉個例子,我們以點擊桌面上的網易雲音樂圖標爲例,分別用右鍵UI path code的方式和雙擊節點的方式生成定位腳本,並分別單獨運行查看效果:

poco("com.mumu.launcher:id/workspace").child("android.view.ViewGroup").child("android.view.ViewGroup").child("android.widget.TextView")[8].click()

poco(text="網易雲音樂").click()

可以看到,UI path code方式生成的腳本是以複雜的層級關係來定位的,並且包含空間索引,不如直接使用text屬性來進行定位的腳本那麼簡潔,還更容易出錯,所以非必要情況下,我們不那麼建議使用這種方式生成定位腳本。

當然,右鍵UI path code方式生成的腳本並不一定都是會出錯的腳本,這裏僅列舉了1個容易出錯的例子,方便說明。

3)多使用控件的text之類的屬性提高效率

我們剛纔講了很多次不建議使用複雜的層次關係(族譜)來進行定位,那麼更加建議的方式是什麼呢?其實就是使用元素的屬性值來定位腳本。

舉個例子,假設我們想要點擊網易雲音樂首頁的“每日推薦”控件,利用文本屬性編寫定位腳本的話,將非常簡潔,效率也會更高,不用管它複雜的層級關係以及空間索引順序:

觸類旁通,使用1個節點的某個屬性值,不僅僅指text屬性,還可以是name屬性或者其它屬性,只要它在當前頁面是唯一的,那麼我們就可以利用這個屬性來定位到我們的控件;甚至藉助節點的多個屬性值來進行精準定位控件,都是可以的。我們非常建議大家多使用這種方式來編寫我們的Poco定位腳本。

4)推薦使用正則表達式匹配控件

我們非常推薦同學們多使用正則表達式來匹配控件,特別是對於一些層次關係非常複雜的控件,使用正則表達式來匹配,會非常簡潔高效。

舉個例子,假設我們希望獲取當前頁面所有歌曲的詳細介紹信息,如果使用之前介紹的定位方式,腳本可能如下:

可以看到,利用基本選擇器和相對選擇器寫出來的定位腳本,看起來非常繁瑣,而且我們還需要非常 精確地瞭解其中的層級關係 ,否則定位腳本就很容易出錯。

那麼我們試試換成正則表達式的定位方式:仔細觀察UI樹發現,這些歌曲信息的控件名都是一樣的,所以只要我們寫1個正則表達式,匹配到這一批相同的控件名,就相當於定位到了當前頁面所有的歌曲信息控件,接下來就可以利用poco遍歷,逐一獲取控件的text屬性了:

是不是非常簡潔高效呢!

4. 小結

那今天的教程內容到這裏就結束了,我們總共介紹了5種生產腳本的方式,以及4種編寫Poco腳本的小技巧,通過下述的思維導圖,可以幫我們快速瞭解整個文章的大致內容:

後續有更多的關於Poco腳本的編寫技巧,我們還會持續跟大家進行分享,希望大家動動手指幫忙點個贊或者在看唄~


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

官方答疑 Q 羣:654700783

呀,這麼認真都看到這裏啦,幫忙點個推薦支持一下唄,灰常感謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章