07編寫(xiě)并運(yùn)行你的第一個(gè)Airtest腳本
同學(xué)們好,我是網(wǎng)易AirtestProject的團(tuán)隊(duì)成員曉娟,歡迎大家來(lái)到我們的視頻教程專(zhuān)欄《14天Airtest自動(dòng)化測(cè)試小白課程》。
今天我們將進(jìn)入一個(gè)全新的專(zhuān)題:自動(dòng)化腳本編寫(xiě)專(zhuān)題。在這個(gè)專(zhuān)題中,我們主要想通過(guò)一些腳本編寫(xiě)的實(shí)操案例,讓大家快速上手Airtest、poco和airtest-selenium等框架,并對(duì)自動(dòng)化測(cè)試有更深的認(rèn)知和實(shí)踐。
今天我們先來(lái)學(xué)習(xí)下:如何編寫(xiě)并運(yùn)行你的第一個(gè)Airtest腳本。
錄制/編寫(xiě)Airtest腳本
首先我們需要在IDE中連接上1臺(tái)待測(cè)設(shè)備,這里以雷電模擬器為例(簡(jiǎn)單復(fù)習(xí)下連接設(shè)備的內(nèi)容):
選擇遠(yuǎn)程設(shè)備連接--輸入雷電模擬器端口號(hào)5554--點(diǎn)擊連接--等待設(shè)備列表中刷出雷電模擬器--點(diǎn)擊connect完成連接。
接下來(lái)我們就可以用IDE的錄制功能,來(lái)幫助我們完成一段簡(jiǎn)單的Airtest腳本了:
點(diǎn)擊Airtest輔助窗的錄制按鈕,然后隨著我們?cè)谠O(shè)備上進(jìn)行一些點(diǎn)擊、滑動(dòng)操作,腳本編輯窗口就自動(dòng)生成了一些Airtest截圖腳本,這個(gè)功能對(duì)新手同學(xué)來(lái)說(shuō)會(huì)比較友好一些,只要我們用鼠標(biāo)在設(shè)備畫(huà)面上進(jìn)行點(diǎn)擊、滑動(dòng)等操作,就會(huì)自動(dòng)幫我們生成代碼。

當(dāng)然,除了這個(gè)錄制功能,我們還可以使用Airtest輔助窗里面提供的功能按鈕,寫(xiě)出更加豐富的Airtest腳本:

Airtest核心API介紹
1.在當(dāng)前設(shè)備畫(huà)面上進(jìn)行一次點(diǎn)擊:touch()
touch(Template(r"tpl1606730579419.png", target_pos=5))
touch((100, 100))
2.等待當(dāng)前畫(huà)面上出現(xiàn)某個(gè)匹配的Template圖片:wait()
wait(Template(r"tpl1606821804906.png"), timeout=120, interval=3)
3.在當(dāng)前設(shè)備畫(huà)面上進(jìn)行一次滑動(dòng)操作:swipe()
swipe(Template(r"tpl1606814865574.png"), vector=[-0.0316, -0.3311])
swipe((100, 100), (200, 200))
4.檢查設(shè)備上是否存在給定目標(biāo):exists()
exists(Template(r"tpl1606822430589.png"))
5.在目標(biāo)設(shè)備上輸入文本,文本框需要處于激活狀態(tài):text()
text("test")
text("test", enter=False)
6.在設(shè)備上執(zhí)行keyevent按鍵事件:keyevent()
keyevent("HOME")
keyevent("KEYCODE_DEL")
7.對(duì)目標(biāo)設(shè)備進(jìn)行一次截圖,并且保存到文件中:snapshot()
snapshot(msg="index")
snapshot(filename="test.png", msg="test")
8.設(shè)置一個(gè)等待sleep時(shí)間,它將會(huì)被顯示在報(bào)告中:sleep()
sleep(1)
9.設(shè)備屏幕上存在斷言目標(biāo):assert_exists()
assert_exists(Template(r"tpl1607324047907.png"), "assert exists")
10.設(shè)備屏幕上不存在斷言目標(biāo):assert_not_exists()
assert_not_exists(Template(r"tpl1607324047907.png"), "assert not exists")
11.斷言兩個(gè)值相等:assert_equal()
assert_equal(1, 1, msg="assert 1==1")
12.斷言兩個(gè)值不相等:assert_not_equal()
assert_not_equal(1, 2, msg="assert 1!=2")
借助Airtest輔助窗的錄制功能,和豐富的功能按鈕,我們熟悉了一下Airtest的API。接下來(lái)我們可以嘗試完成1個(gè)需求更加復(fù)雜的純Airtest腳本,這個(gè)腳本需要我們學(xué)習(xí)一些基礎(chǔ)的python語(yǔ)法,比如如何定義函數(shù)、如何編寫(xiě)條件語(yǔ)句和循環(huán)語(yǔ)句、如何使用python的time模塊等等,這些python基礎(chǔ)同學(xué)們可以在網(wǎng)上找到很多詳細(xì)的教程,這里就不再重復(fù)講解了:
先來(lái)看看我們這個(gè)腳本具體要做些什么:
1.進(jìn)入網(wǎng)易云音樂(lè)
2.找到指定的薛之謙的歌曲
3.回到首頁(yè)
4.進(jìn)入抖音歌曲排行榜
5.完整運(yùn)行上述腳本并統(tǒng)計(jì)運(yùn)行時(shí)長(zhǎng)
總共是5個(gè)需求,腳本是我們?cè)谡n前就寫(xiě)好了的。因?yàn)榭紤]到如果在課上編寫(xiě)可能需要耗費(fèi)過(guò)長(zhǎng)的時(shí)間,所以我們事先準(zhǔn)備好了。課上我們主要想把一些關(guān)鍵的知識(shí)點(diǎn)給大家先講解清楚,然后課下的時(shí)候同學(xué)們可以嘗試自己完成這個(gè)腳本。

另外需要這個(gè)示例腳本來(lái)學(xué)習(xí)的同學(xué),可以到我們的官方公眾號(hào)回復(fù)“A07”即可獲取。

那我們回到這個(gè)腳本中來(lái),可以看到,前面4個(gè)需求都被封裝成了1個(gè)個(gè)的函數(shù),腳本最后調(diào)用了這些函數(shù),并計(jì)算了整個(gè)運(yùn)行時(shí)長(zhǎng)。
先來(lái)看第一部分:進(jìn)入網(wǎng)易云音樂(lè)。
1.為保證app的初始狀態(tài)一致,這里使用了clear_app()來(lái)清除了網(wǎng)易云音樂(lè)的應(yīng)用,之后再用start_app()打開(kāi)應(yīng)用。這兩個(gè)方法傳入的都是應(yīng)用包名。
2.之后點(diǎn)擊同意服務(wù)條款,點(diǎn)擊完同意之后,會(huì)有一個(gè)很長(zhǎng)的啟動(dòng)動(dòng)畫(huà),我們只有等這個(gè)啟動(dòng)動(dòng)畫(huà)結(jié)束之后,才能進(jìn)行下一步操作,所以這里可以使用一些wait()等待。
3.然后再勾選服務(wù)協(xié)議,點(diǎn)擊立即體驗(yàn),就可以進(jìn)入應(yīng)用的主頁(yè)了
4.最后我們還斷言了一下,當(dāng)出現(xiàn)排行榜的圖標(biāo)時(shí),表明我們已經(jīng)進(jìn)入了云音樂(lè)的主頁(yè)
這就是第一個(gè)需求的全部?jī)?nèi)容
那么第二個(gè)需求:找到指定的薛之謙的歌曲
1.點(diǎn)擊搜索按鈕之前,我們做了個(gè)存在的判斷,因?yàn)閯偛胚M(jìn)入主頁(yè)的時(shí)候,加載頁(yè)面需要一定時(shí)間,我們先判斷搜索按鈕存在了,再進(jìn)行點(diǎn)擊,腳本會(huì)更加穩(wěn)定些
2.接著就調(diào)用text()接口輸入關(guān)鍵詞“薛之謙”,然后一步步找到歌手薛之謙并進(jìn)行點(diǎn)擊
3.接著點(diǎn)擊“近期熱門(mén)”開(kāi)始歌曲,在底部的播放列表中,左滑可以切換成下一首歌曲,為了找到指定的歌曲,我們需要寫(xiě)一個(gè)循環(huán)操作,當(dāng)沒(méi)有找到指定歌曲時(shí),就一直左滑
4.找到歌曲后,進(jìn)入歌曲頁(yè)面,做一個(gè)斷言表示成功找到了我們指定的歌曲
第三個(gè)需求:返回首頁(yè)
這個(gè)比較簡(jiǎn)單,我們可以用4條點(diǎn)擊返回按鈕的腳本,也可以直接用返回動(dòng)作的關(guān)鍵詞語(yǔ)句,keyevent("BACK"),寫(xiě)個(gè)for循環(huán),執(zhí)行4次就行。
第四個(gè)需求:進(jìn)入抖音排行榜
這個(gè)需求跟第2個(gè)需求有點(diǎn)類(lèi)似,點(diǎn)擊排行榜之后,要下滑好幾次才能找到抖音排行榜,所以依舊可以寫(xiě)一個(gè)循環(huán)操作,沒(méi)找到抖音排行榜之前就一直下滑。
最后1個(gè)需求就是執(zhí)行上面寫(xiě)的幾個(gè)方法,然后記錄總的運(yùn)行時(shí)長(zhǎng)。為了保證運(yùn)行失敗我們也可以繼續(xù)記錄時(shí)長(zhǎng),我們使用了try-except方法,把幾個(gè)方法的執(zhí)行做了一個(gè)異常處理,這樣即使有報(bào)錯(cuò)的話也不會(huì)終止腳本的運(yùn)行,而是拋出任務(wù)執(zhí)行失敗的錯(cuò)誤。
這個(gè)腳本的知識(shí)點(diǎn)大概就講解這些,課后同學(xué)們可以自己嘗試把這個(gè)腳本寫(xiě)出來(lái)。
運(yùn)行腳本
那么講了這么多編寫(xiě)腳本的內(nèi)容之后,我們?cè)賮?lái)看看怎樣在IDE里面運(yùn)行腳本把。IDE是支持一鍵回放腳本的,我們可以先回到上面我們講錄制功能時(shí)自動(dòng)幫我們生成的那個(gè)腳本,點(diǎn)擊頂部菜單欄的運(yùn)行腳本按鈕(快捷鍵F5),就可以回放我們錄制好的腳本了,非常簡(jiǎn)單:

但也有同學(xué)可能會(huì)問(wèn),如果不想在IDE中運(yùn)行腳本,可以怎么執(zhí)行呢?這個(gè)內(nèi)容我們后面會(huì)專(zhuān)門(mén)花一節(jié)課來(lái)講解,同學(xué)們可以繼續(xù)關(guān)注我們后續(xù)的課程。
另外停止運(yùn)行的按鈕就在腳本運(yùn)行按鈕隔壁,快捷鍵為shift+F5。
生成/導(dǎo)出報(bào)告
運(yùn)行完腳本之后,接下來(lái)就是查看我們的運(yùn)行報(bào)告了。我們這里給大家展示下上述比較復(fù)雜的那個(gè)腳本的報(bào)告,點(diǎn)擊IDE頂部菜單欄中查看報(bào)告的按鈕(快捷鍵是ctrl+l),就會(huì)在我們的默認(rèn)瀏覽器中打開(kāi)1個(gè)html格式的報(bào)告,這里大家最好用谷歌瀏覽器來(lái)打開(kāi)我們的Airtest報(bào)告,兼容性會(huì)更好一些。
在報(bào)告中,我們可以看到頂部關(guān)于報(bào)告的作者、描述等一些信息,下方還可以看到腳本中的斷言是否成功,每一個(gè)步驟的畫(huà)面截圖如何等。

另外在IDE中,右鍵點(diǎn)擊腳本名稱,選擇打開(kāi)報(bào)告文件目錄,可以直接打開(kāi)報(bào)告文件所在的文件夾,一般來(lái)說(shuō),里面包含了很多截圖文件、1個(gè)html報(bào)告和1個(gè)log.txt:

如果我們想把報(bào)告發(fā)給別人觀看,直接把這個(gè)報(bào)告文件夾發(fā)給別人,別人是不能夠正常查看的,我們需要把報(bào)告先導(dǎo)出,讓里面包含所需的靜態(tài)資源文件,別人才可以正常查看。導(dǎo)出方法也很簡(jiǎn)單,依舊是右鍵點(diǎn)擊腳本名稱,選擇導(dǎo)出報(bào)告,再選擇要保存導(dǎo)出報(bào)告的路徑,IDE就會(huì)自動(dòng)幫我們?cè)谥付窂较聦?dǎo)出當(dāng)前報(bào)告了:

可以看到,導(dǎo)出腳本的文件夾中,比剛才未導(dǎo)出的報(bào)告文件夾,多了很多東西,比如腳本文件、靜態(tài)資源文件、腳本內(nèi)的截圖文件等等。
把導(dǎo)出好的報(bào)告,發(fā)給別人觀看,別人才能夠正常查看你生成的報(bào)告。
小結(jié)
好了,今天的課程就到此為止啦。這節(jié)課我們主要給大家講解了如何編寫(xiě)Airtest腳本、如何運(yùn)行腳本以及如何生成或?qū)С鰣?bào)告。希望同學(xué)們?cè)谡n后可以嘗試把課中講解的那個(gè)5個(gè)需求的案例腳本編寫(xiě)出來(lái)。

下節(jié)課我們會(huì)進(jìn)入到poco腳本的學(xué)習(xí)和編寫(xiě),下期我們不見(jiàn)不散~