08編寫并運(yùn)行你的第一個(gè)Poco腳本
同學(xué)們好,我是網(wǎng)易AirtestProject的團(tuán)隊(duì)成員曉娟,歡迎大家來(lái)到我們的視頻教程專欄《14天Airtest自動(dòng)化測(cè)試小白課程》。
上節(jié)課我們一起學(xué)習(xí)了如何編寫Airtest腳本,Airtest框架的核心就是截圖腳本。而我們的另一個(gè)測(cè)試框架Poco,跟Airtest的差別非常大,它的核心是 元素定位 。
那么今天我們就來(lái)學(xué)習(xí)下:poco腳本的編寫和運(yùn)行。
poco輔助窗功能
與編寫Airtest腳本的步驟相似,我們首先需要在IDE中連接上1臺(tái)待測(cè)設(shè)備,這里以雷電模擬器為例,連接好設(shè)備之后,我們來(lái)看看poco輔助窗:

① 選擇對(duì)應(yīng)的poco模式
點(diǎn)擊stop的下拉按鈕,可以顯示目前所支持的平臺(tái),比如unity、UE4、Android和iOS等,測(cè)試哪個(gè)平臺(tái),我們就需要把這里的poco模式選到對(duì)應(yīng)的平臺(tái)。比如我們這里想要測(cè)安卓模擬器的原生應(yīng)用,就需要在下拉菜單中選擇安卓模式: ?

選擇了Android模式之后,等待幾秒,窗口就會(huì)刷出當(dāng)前設(shè)備的UI樹,并且在腳本編輯窗中,會(huì)彈出1個(gè)是否插入poco初始化代碼的提示,選擇yes之后,腳本編輯窗就會(huì)被自動(dòng)插入當(dāng)前模式的初始化腳本: ?

當(dāng)然,如果我們想要測(cè)試unity游戲,就需要在poco模式中選擇unity,而不是Android。當(dāng)UI樹正常顯示之后,我們就可以使用poco輔助窗的鎖定UI控件或者錄制poco腳本的功能了。
不過(guò)需要注意的是,除了安卓原生和iOS原生不需要接入pocosdk就可以直接顯示UI樹之外,其余引擎的游戲,比如unity、UE4、Cocos creator等,都需要事先按官網(wǎng)教程接入pocosdk后,才能夠獲取到poco的UI樹。
各種平臺(tái)接入SDK的教程匯總
1. unity3d接入教程 :https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html#unity3d
2. cocos2dx-lua接入教程:https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html#cocos2dx-lua
3. cocos2dx-js接入教程:https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html#cocos2dx-js-beta
4. cocos-creator接入教程:https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/integration.html#cocos-creator
5. Egret接入教程:https://github.com/AirtestProject/Poco-SDK/tree/master/Egret
6. UE4接入教程:https://mp.weixin.qq.com/s?__biz=MzUxMDc4NTkwMA==&mid=2247484258&idx=1&sn=0fec4461bc870077af4e096b494d646a&chksm=f97ce361ce0b6a77c885193a900d2be08d22c3cf86a0e90a5fb0e83758aaffc65a9d00ec3927&token=1860040772&lang=zh_CN#rd
7. 自行接入其它引擎的教程:https://poco-chinese.readthedocs.io/zh_CN/latest/source/doc/implementation_guide.html
8. WebView檢視:https://airtest.doc.io.netease.com/IDEdocs/poco_framework/poco_webview/
其它
無(wú)需接入pocoSDK的平臺(tái):Android原生、iOS原生
暫不支持的平臺(tái):Windows、MacOS等
② poco檢索功能
先來(lái)看下鎖定查看UI控件的功能,單擊像一把小鎖一樣的按鈕,此時(shí)整個(gè)設(shè)備畫面會(huì)被鎖定;之后再把鼠標(biāo)移動(dòng)到設(shè)備畫面上,可以看到鼠標(biāo)能夠檢索出畫面內(nèi)包含的控件,并且會(huì)用1個(gè)半透明的框框住了這個(gè)控件,單擊該控件,log查看窗就會(huì)顯示出該控件的屬性信息,這個(gè)功能可以幫助我們快速查看控件的所有屬性:??

小鎖右邊的檢索按鈕,跟剛才介紹的又有點(diǎn)不同,它可以檢索當(dāng)前頁(yè)面的控件,但是不會(huì)鎖定設(shè)備的當(dāng)前頁(yè)面,也就是說(shuō),隨著鼠標(biāo)的點(diǎn)擊動(dòng)作,畫面會(huì)跟著做出對(duì)應(yīng)的響應(yīng): ?

③ 錄制poco腳本
接下來(lái)我們看看錄制按鈕,隨著鼠標(biāo)在設(shè)備上對(duì)各個(gè)控件進(jìn)行點(diǎn)擊或者滑動(dòng)的操作,腳本編輯窗會(huì)自動(dòng)生成一系列的poco腳本: ?

對(duì)于錄制好的poco腳本,我們也可以在IDE中右鍵單獨(dú)運(yùn)行,或者一鍵回放。
api介紹和定位選擇器
當(dāng)然,除了采用錄制的方法生成poco腳本之外,更重要的是,學(xué)會(huì)自己編寫poco腳本,實(shí)現(xiàn)更多更復(fù)雜的需求。主要有2個(gè)問(wèn)題:1個(gè)是元素的定位語(yǔ)句是怎么寫的;第2個(gè)是poco常見(jiàn)的api操作有哪些。
① 定位選擇器
我們先來(lái)看看第1個(gè)問(wèn)題,編寫元素定位語(yǔ)句,poco給我們提供了3種定位選擇器:一是基本選擇器,即利用元素的一些基本屬性來(lái)進(jìn)行定位,比如name、text等等。舉個(gè)例子,poco(name="網(wǎng)易云音樂(lè)"),這個(gè)定位語(yǔ)句就是使用基本選擇器進(jìn)行定位的。當(dāng)然我們可以不止使用1個(gè)屬性來(lái)定位,括號(hào)里面可以用多個(gè)屬性來(lái)定位控件。剛才我們學(xué)習(xí)了如何檢索控件,查看元素屬性,就可以用那些屬性寫定位語(yǔ)句了。
二是相對(duì)選擇器,即利用控件之間的父子關(guān)系、爺孫關(guān)系和兄弟關(guān)系等來(lái)定位控件。例如parent()、child()、offspring()等。舉個(gè)例子:poco("androidx.appcompat.widget.LinearLayoutCompat").child("搜索"),就是典型的利用父子關(guān)系來(lái)定位元素的,這個(gè)需要借助poco輔助窗的那棵UI樹,觀察目標(biāo)節(jié)點(diǎn)附近的控件,然后利用相對(duì)關(guān)系進(jìn)行定位。有些比較難定位的節(jié)點(diǎn),可能需要編寫幾層關(guān)系才可以定位到,比如剛才我們錄制的時(shí)候,就很容易出現(xiàn)很長(zhǎng)的定位語(yǔ)句。
三是控件順序選擇器,常用于UI樹中多個(gè)相同名稱的節(jié)點(diǎn)定位。比如,poco("com.netease.cloudmusic:id/mainActivityTab").offspring("androidx.appcompat.app.ActionBar$Tab")[0],定位的就是這4個(gè)相同名字節(jié)點(diǎn)的第1個(gè),坐標(biāo)是從0開始遞增的。

② poco常用的api
了解完這3種定位方式之后,我們?cè)賮?lái)看看poco都有哪些常見(jiàn)的控件操作,這里以我們官網(wǎng)上提供的1個(gè)unity游戲(https://poco.readthedocs.io/en/latest/source/doc/poco-example/index.html)為例,這個(gè)demo已經(jīng)事先接入了pocosdk,所以在設(shè)備上安裝好這個(gè)demo,打開游戲,在poco輔助窗內(nèi)選擇unity模式,等待幾秒即可刷出這個(gè)游戲的UI樹了: ?

然后看一下,我們常見(jiàn)的poco功能有以下幾點(diǎn):
1)點(diǎn)擊操作
poco("star_single").click()poco('star_single').long_click()
2)讀取和設(shè)置控件的屬性poco("star_single").get_name()poco("star_single").attr('name')poco("star_single").get_text()poco("pos_input").set_text("123")poco("pos_input").setattr('text',"456")
3)判斷元素是否存在
poco(XXX).exists()
4)拖動(dòng)與滑動(dòng)
poco("star").drag_to(poco("shell"))
5)內(nèi)部偏移和外部偏移(focus)poco("pearl").focus([0.1,0.1]).long_click()poco("pearl").focus([0.9,0.9]).long_click()poco("pearl").focus([0.5,-3]).long_click()
6)遍歷元素
for star in poco("playDragAndDrop").child("star"): ? ?star.drag_to(poco("shell"))
7)等待事件poco("bomb").wait_for_appearance()poco("bomb").wait_for_disappearance()yellow = poco("yellow")blue = poco("blue")black = poco("black")poco.wait_for_all([yellow,blue,black])poco.wait_for_any([bomb,yellow,blue])
③ 官網(wǎng)的unity游戲demo
這個(gè)demo可以幫助我們很好地去練習(xí)這些常見(jiàn)的poco api,課前我們也準(zhǔn)備了1個(gè)測(cè)試這個(gè)demo的腳本,里面基本包含了poco所有常見(jiàn)的api:

老樣子,我們先講解下這個(gè)腳本里面的一些知識(shí)點(diǎn),課后同學(xué)們?cè)僮约簢L試寫一個(gè)這樣的腳本出來(lái),鞏固知識(shí)點(diǎn)。另外需要這個(gè)示例腳本來(lái)學(xué)習(xí)的同學(xué),可以到我們的官方公眾號(hào)回復(fù)“A08”即可獲取。

生成和導(dǎo)出報(bào)告
上面我們已經(jīng)給大家演示過(guò)這個(gè)腳本的運(yùn)行了,如上節(jié)課講的那樣,我們直接點(diǎn)擊頂部菜單欄的查看報(bào)告按鈕,即可生成這份poco腳本的運(yùn)行報(bào)告,并用你電腦的默認(rèn)瀏覽器打開(建議使用谷歌瀏覽器,對(duì)報(bào)告的兼容性最好)。
另外這份報(bào)告僅限于在本地查看。如需發(fā)給別人查看,我們需要導(dǎo)出腳本:右鍵單擊腳本名稱,選擇導(dǎo)出報(bào)告,在選擇導(dǎo)出的路徑,等到報(bào)告導(dǎo)出即可。
小結(jié)
好了,這節(jié)課的內(nèi)容就到此為止啦,今天我們主要學(xué)習(xí)了poco腳本的錄制、定位腳本的編寫以及常見(jiàn)的poco api等等,內(nèi)容還是比較多的,希望同學(xué)們課后可以好好練習(xí),先把課上講的示例自己編寫一遍之后,就可以嘗試寫一寫別的應(yīng)用的poco測(cè)試腳本了。

下節(jié)課我們將學(xué)習(xí)一個(gè)新的庫(kù):airtest-selenium,用于網(wǎng)頁(yè)的自動(dòng)化測(cè)試,下期我們不見(jiàn)不散~