摘要:的框架是網(wǎng)易團(tuán)隊(duì)自己開發(fā)的一個(gè)圖像識(shí)別框架,這個(gè)框架的祖宗就是一種新穎的圖形腳本語言。基本操作方法除了跨平臺(tái)的還有平臺(tái)特定的,比如安卓平臺(tái)蘋果平臺(tái)平臺(tái)這里我們來詳細(xì)說說這些模塊。
Airtest是網(wǎng)易出品的一款基于圖像識(shí)別和poco控件識(shí)別的一款UI自動(dòng)化測試工具。Airtest的框架是網(wǎng)易團(tuán)隊(duì)自己開發(fā)的一個(gè)圖像識(shí)別框架,這個(gè)框架的祖宗就是一種新穎的圖形腳本語言Sikuli。Sikuli這個(gè)框架的原理是這樣的,計(jì)算機(jī)用戶不需要一行行的去寫代碼,而是用屏幕截屏的方式,用截出來的圖形擺列組合成神器的程序,這是Airtest的一部分。
另外,Airtest也基于poco這個(gè)U控件搜索框架,這個(gè)框架也是網(wǎng)易自家的跨平臺(tái)U測試框架,原理類似于appium,通過控件的名稱,id之類的來定位目標(biāo)控件,然后調(diào)用函數(shù)方法,例如click(),swip()之類的方法來對(duì)目標(biāo)控件進(jìn)行點(diǎn)擊或者是操作。
概念:自動(dòng)化測試,就是把繁雜的人工測試用例利用自動(dòng)化測試工具編寫成代碼,讓機(jī)器代替人工自動(dòng)跑用例的過程。實(shí)際上就是把以人為驅(qū)動(dòng)的測試行為轉(zhuǎn)化為機(jī)器執(zhí)行的一種過程。
意義:節(jié)省人力、物力、時(shí)間、硬件資源等,提升測試效率,特別對(duì)于繁瑣重復(fù)的測試用例,可以使測試人員更專注于新的測試模塊的建立和開發(fā),從而提高測試覆蓋率。
以上主流工具的優(yōu)點(diǎn)跟缺點(diǎn):
相較于以上工具來說,Airtest有以下優(yōu)點(diǎn)和缺點(diǎn):
所以其實(shí)基于圖像識(shí)別的Airtest更適合用于游戲測試多一點(diǎn)。
1、AirtestIDE的下載
AirtestIDE已經(jīng)幫你集成了所有的環(huán)境,自帶錄制腳本欄,自動(dòng)生成腳本,自帶編輯器還自帶模擬器,有了一個(gè)AirtestIDE就可以輕松簡單的錄制腳本了。下載地址是Airtest的官網(wǎng):
http://airtest.netease.com/
AirtestIDE的使用教程跟文檔也在下面的連接中:
https://airtest.doc.io.netease.com/
使用AirtestIDE對(duì)Android應(yīng)用進(jìn)行自動(dòng)化測試時(shí),第一步就需要連接Android設(shè)備。
Android真機(jī)連接準(zhǔn)備:
如果遇到連接問題,請(qǐng)查閱Android連接常見問題:https://airtest.doc.io.netease.com/IDEdocs/faq/1_common%20problems/
手機(jī)連上Airtest之后,會(huì)向手機(jī)中安裝2個(gè)app,如下:
pocoservice是支撐poco操作的app,yosemite是airtest的輸入法,安裝之后,手機(jī)的默認(rèn)輸入法會(huì)變成這個(gè)輸入法,如果需要改回來原來的輸入法,需要手動(dòng)到手機(jī)設(shè)置里面進(jìn)行修改;
當(dāng)手機(jī)與電腦處在同一個(gè)wifi下,即可嘗試無線連接手機(jī)了,但是這種方式受限于網(wǎng)絡(luò)連接的穩(wěn)定性,可能會(huì)出現(xiàn)連接不夠穩(wěn)定的情況。具體連接操作步驟如下:
點(diǎn)擊錄制按鈕,選擇事件進(jìn)行錄制,可以用鼠標(biāo)操作
介紹一下錄制時(shí)每一個(gè)參數(shù)的作用
可以按照需要的參數(shù)進(jìn)行配置
在下載解壓 Airtest 腳本的專屬 IDE——AirtestIDE 后,點(diǎn)擊 “新建腳本” 按鈕,默認(rèn)即可創(chuàng)建一個(gè)后綴名為.air
的腳本文件,.air
這是 Airtest 腳本的專屬后綴。
讓我們打開剛才新建腳本的文件夾,可以看到實(shí)際上.air
腳本文件是一個(gè)普通的文件夾,里面附帶了一個(gè)同名的.py
文件,AirtestIDE 在執(zhí)行腳本時(shí),實(shí)際上執(zhí)行的是里面的.py
文件。也就是說,Airtest 腳本雖然自帶一個(gè)后綴名,然而本質(zhì)上依然是 Python 腳本,遵循的是 Python 語法,我們可以根據(jù)實(shí)際需要自由地import其他 Python 第三方庫。
值得注意的是,.air
文件夾中必須要有同名的.py
文件,否則在命令行執(zhí)行airtest run test.air
這樣的運(yùn)行指令時(shí)會(huì)導(dǎo)致失敗。
首先,就像一個(gè)普通的 Python 腳本一樣,我們需要在代碼文件的最開頭部分,寫上from airtest.core.api import *
,將 Airtest 的主要 API 都 import 進(jìn)來,以便在后續(xù)腳本中使用這些 API。
auto_setup
?是一個(gè)用來初始化環(huán)境的接口,接口文檔在這里,它接受 4 個(gè)參數(shù),我們可以設(shè)置當(dāng)前腳本所在的路徑、指定運(yùn)行腳本的設(shè)備、設(shè)置默認(rèn)的 log 路徑和設(shè)置腳本父路徑。
auto_setup
不傳入任何參數(shù)的話,Airtest 將會(huì)讀取運(yùn)行時(shí)命令行中傳入的各項(xiàng)參數(shù),來對(duì)環(huán)境進(jìn)行初始化。auto_setup(__file__)
,意思是將腳本文件作為腳本路徑傳入,其他參數(shù)內(nèi)容將默認(rèn)讀取運(yùn)行命令行傳入的參數(shù)。腳本運(yùn)行命令行有兩種形式,命令行中的參數(shù)包含device
、log
等:
>airtest run untitled.air --device Android:///手機(jī)設(shè)備號(hào) --log log/
。"D:/AirtestIDE-path/AirtestIDE" runner "D:/script-path/untitled.air" --device Android://127.0.0.1:5037/5PZTQWQOGES8RWUG --log "C:/Users/username/AppData/Local/Temp/AirtestIDE/scripts/aa8c71acdfa70c3068b862cb42ffb8dc"
--device Android:///
這樣的設(shè)備參數(shù),那么腳本在初始化時(shí)會(huì)自動(dòng)連上對(duì)應(yīng)的設(shè)備,不需要再另外寫代碼連接了。connect_device
接口來連接設(shè)備。set_current
接口可以在多個(gè)設(shè)備中進(jìn)行切換,device()
接口可以獲取到當(dāng)前使用中的設(shè)備。Airtest 作為自動(dòng)化測試框架,模擬的是人的操作,常見接口主要有:
touch
?點(diǎn)擊某個(gè)位置,可以設(shè)定被點(diǎn)擊的位置、次數(shù)、按住時(shí)長等參數(shù)swipe
?從一個(gè)位置滑動(dòng)到另外一個(gè)位置text
?調(diào)用輸入法輸入指定內(nèi)容keyevent
?輸入某個(gè)按鍵響應(yīng),例如回車鍵、刪除鍵wait
?等待某個(gè)指定的圖片元素出現(xiàn)snapshot
?對(duì)當(dāng)前畫面截一張圖核心 API 請(qǐng)參見這個(gè)文檔,在這個(gè)文檔頁里出現(xiàn)的 API 都是跨平臺(tái) API,由于我們?cè)诖a的第一行里將airtest.core.api
里的接口全部import
進(jìn)來了,因此這些 API 可以在代碼里直接進(jìn)行調(diào)用,像這樣:
from airtest.core.api import *touch((x, y))
在很多接口中,支持傳入Template
圖片對(duì)象作為參數(shù),在運(yùn)行時(shí)將會(huì)去點(diǎn)擊圖片在畫面中的所在位置,類似這樣:
# 等價(jià)于 touch((x, y)), (x, y)是圖片所在的中心點(diǎn)touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
其中,Template
對(duì)象是一個(gè)圖片類,Airtest 會(huì)先嘗試在當(dāng)前畫面中尋找能夠匹配這張圖片的位置,如果找到了,將對(duì)這個(gè)坐標(biāo)進(jìn)行點(diǎn)擊操作,如果找不到,將拋出識(shí)別異常。我們將在后文對(duì)Template
圖片類進(jìn)行更加詳細(xì)的介紹。
1)使用 pip 安裝Airtest框架 pip install airtest
2)若運(yùn)行代碼時(shí),在cv2模塊報(bào) ImportError: DLL load failed: 找不到指定模塊 的錯(cuò),如果使用的python版本低于3.7,請(qǐng)直接運(yùn)行:
pip uninstall opencv-contrib-python# 若以下安裝語句運(yùn)行失敗,可以嘗試更新pip到最新版本后重試pip install opencv-contrib-python==3.2.0.7
3)Poco安裝
使用 pip 安裝poco框架 pip install pocoui
,請(qǐng)注意庫的名稱為 pocoui
,不要填錯(cuò)。
除了跨平臺(tái)的API還有平臺(tái)特定的API,比如:
airtest.core.android #安卓平臺(tái)airtest.core.ios #蘋果平臺(tái)airtest.core.win #Windows平臺(tái)
這里我們來詳細(xì)說說這些模塊。
跨平臺(tái)API模塊
這里我們要介紹的第一個(gè)就是跨平臺(tái)模塊:
from airtest.core.api import * #導(dǎo)入所有方法
1).初始化設(shè)備
這里初始化設(shè)備我們也有兩種方案,下面請(qǐng)看:
根據(jù)設(shè)備的UUID來初始化
語法格式:
init_device(platform="Android",uuid="",cap_method=JAVACAP for Android)#平臺(tái) – Android,IOS或Windows#uuid –目標(biāo)設(shè)備的uuid,例如,用于Android的serialno,用于Windows的handle,用于iOS的uuid#kwargs –可選的平臺(tái)特定關(guān)鍵字args,例如cap_method = JAVACAP for Android
下面我們來列舉一下實(shí)例,如下:
init_device(platform="Android",uuid="127.0.0.1:62001",cap_method="JAVACAP")
根據(jù)設(shè)備的URL來初始化
語法格式如下:
android:/// 連接當(dāng)前安卓設(shè)備android://adbhost:adbport/serial NO.?cap_method=javacap&touch_method=adbwindows:/// 連接本地桌面程序ios:/// 連接IOS設(shè)備
這里我們主要是傳入了ADB地址,端口和連接的夜神模擬器的序列號(hào)而連接上的。具體例子如下:
connect_device("android://127.0.0.1:5037/127.0.0.1:62001?cap_method=javacap&touch_method=adb")
2).返回當(dāng)前活動(dòng)設(shè)備
device()
3).設(shè)置當(dāng)前活動(dòng)設(shè)備
有時(shí)候如果我們連接了多個(gè)設(shè)備,我們需要切換的話,就是用這個(gè)函數(shù)來達(dá)到目的,可以使用設(shè)備的索引或者設(shè)備的序列號(hào)來進(jìn)行切換哦。
set_current(0)set_current("127.0.0.1:62001")
4).運(yùn)行環(huán)境配置
auto_setup(basedir = None,devices = None,logdir = None,project_root = None,compress = 0 )basedir 設(shè)置當(dāng)前腳本的所在位置,__file__也可以。devices 指定運(yùn)行腳本的設(shè)備以列表形式存在logdir 設(shè)置腳本運(yùn)行時(shí)的日志保存路徑,默認(rèn)為None,設(shè)為True可保存project_root 設(shè)置api的項(xiàng)目根目錄
5).開啟并執(zhí)行遠(yuǎn)程Shell命令
shell(cmd) #ls / data / local / tmp
6).在設(shè)備上啟動(dòng)程序
start_app("啟動(dòng)的應(yīng)用程序包名")
7).在設(shè)備上停止程序
stop_app("啟動(dòng)的應(yīng)用程序包名")
8).清除設(shè)備上的應(yīng)用程序數(shù)據(jù)
clear_app("啟動(dòng)的應(yīng)用程序包名")
9).在設(shè)備上安裝應(yīng)用程序
install(filepath="要在目標(biāo)設(shè)備上安裝的文件的路徑")
10).在設(shè)備上卸載應(yīng)用程序
uninstall("應(yīng)用程序包名")
11).截圖并保存到文件中
snapshot(filename="1.jpg",msg="hello",quality=3)filename:圖片名msg:屏幕截圖的簡短描述quality:圖像質(zhì)量,范圍為[1,99]的整數(shù)
12).喚醒并解鎖設(shè)備
wake("設(shè)備")
13).返回目標(biāo)設(shè)備的主屏幕
home("設(shè)備")
14).設(shè)備屏幕上執(zhí)行點(diǎn)擊,滑動(dòng),捏,按鍵,輸入操作
click(v=Template(x,y),times=2) #單擊v:觸摸目標(biāo),可以是Template實(shí)例,也可以是絕對(duì)坐標(biāo)(x,y)times:執(zhí)行多少次觸摸double_click() #雙擊swipe(v1,v2)#滑動(dòng)起點(diǎn)和終點(diǎn)swipe(v1,vector=(x,y))#沿向量移動(dòng),向量可以是坐標(biāo)也可以是屏幕百分比#返回值:原點(diǎn)位置和目標(biāo)位置pinch()#捏操作,相當(dāng)于縮放,參數(shù)如下:in_or_out:放大或縮小center:默認(rèn)為None表示屏幕中心percent:捏動(dòng)作的屏幕比例,默認(rèn)值為0.5 keyevent(keyname="Home")#按鍵操作text("文本")#在設(shè)備上輸入文本
15).睡眠,等待
sleep(2)#睡眠兩秒,延遲兩秒wait(v,timeout,interval,intervalfunc)#等待與設(shè)備屏幕上的模板匹配v:等待的目標(biāo)對(duì)象timeout:超時(shí)時(shí)間interval:嘗試找到匹配項(xiàng)的時(shí)間間隔(秒)intervalfunc:在每次未成功嘗試找到相應(yīng)匹配項(xiàng)后調(diào)用返回值:匹配目標(biāo)的坐標(biāo)
16).檢查給定目標(biāo)在設(shè)備屏幕上是否存在
exists(v)v:檢查對(duì)象如果找不到目標(biāo),則為False,否則返回目標(biāo)的坐標(biāo)
17).在設(shè)備屏幕上查找所有出現(xiàn)的目標(biāo)并返回其坐標(biāo)
find_all(v)v:尋找目標(biāo)返回坐標(biāo)列表
18).斷言操作
assert_exists(v,msg) #斷言目標(biāo)存在于設(shè)備屏幕上assert_not_exists(v,msg) #斷言目標(biāo)在設(shè)備屏幕上不存在v:要檢查的目標(biāo)msg:斷言的簡短描述assert_equal(v1,v2,msg) #斷言兩個(gè)值相等assert_not_equal(v1,v2,msg) #斷言兩個(gè)值不相等v1:第一個(gè)值v2:第二個(gè)值msg:斷言的簡短描述
這里基本上我們就把使用方法說完了,下面我們來進(jìn)行下實(shí)際操作,下一篇文章即將奉上。
from airtest.core.api import *# 通過ADB連接本地Android設(shè)備connect_device("Android:///")#安裝待測軟件apk,路徑信息。install("path/to/your/apk")#開始運(yùn)行appstart_app("com.pingan.certicationApp")#點(diǎn)擊某個(gè)圖片,Airtest中基于圖像識(shí)別語法,圖片自己提供。touch(Template("image_of_a_button.png"))#滑動(dòng)語音,開頭圖片跟結(jié)尾圖片swipe(Template("slide_start.png"), Template("slide_end.png"))#添加斷言的圖片assert_exists(Template("success.png"))#點(diǎn)擊Android上的返回鍵#keyevent("BACK")#點(diǎn)擊Android上的Home鍵返回#home()#uninstall("package_name_of_your_apk")
# -*- encoding=utf8 -*-__author__ = "enmonster"from airtest.core.api import *auto_setup(__file__)from poco.drivers.android.uiautomation import AndroidUiautomationPocopoco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)poco("com.miui.home:id/workspace").offspring("計(jì)算器").offspring("com.miui.home:id/icon_icon").click()poco("com.miui.calculator:id/btn_c_s").click()poco("com.miui.calculator:id/digit_7").click()poco("com.miui.calculator:id/op_add").click()poco("com.miui.calculator:id/digit_5").click()poco("com.miui.calculator:id/btn_equal_s").click()
poco輔助窗
poco是通過元素本身的屬性來定位元素,常用的API如下:
attr(‘type’):提取指定元素屬性為type的值
get_text(): 提取指定元素的文本內(nèi)容
attr(‘text’): 通過給定的屬性名檢索ui元素的屬性。如果屬性不存在,則返回none(屬性有visible、text、type、pos、size、name等)
exists():判斷指定元素是否在當(dāng)前屏幕上存在,存在true、不存在false
click(): 點(diǎn)擊事件,可使用click(center)、click([0.5,0.5])、focus([0.5,0.5]).click()來點(diǎn)擊控件中心位置
rclick():右鍵點(diǎn)擊
double_click():雙擊操作
long_click():長按操作
swipe:滑動(dòng)事件,如:swipe([0.2, -0.2], duration=1)以45度角滑動(dòng),持續(xù)1秒鐘
drag:拖拽事件,如:poco(text=‘需要拖動(dòng)位置’).drag_to(poco(text=‘目標(biāo)位置’))
focus (local positioning):局部定位,如:poco(‘控件地址’).focus(‘center’).click()點(diǎn)擊控件中間位置
wait:等待事件,如:poco(‘控件地址’).wait(2).click() 控件出現(xiàn)就點(diǎn)擊,最多等待2秒
如果case中涉及到兩個(gè)手機(jī)交互的,可以在.py文件中連接多個(gè)手機(jī),需要在哪個(gè)手機(jī)上操作,就需要在腳本中使用set_cerrent()借口來切換到相應(yīng)的手機(jī)上;
device1 = "c17a4cb4" #設(shè)備1device2 = "RKK0217C15003363" #設(shè)備2dev1 = connect_device("android://127.0.0.1:5037/"+device1)#連接設(shè)備1dev2 = connect_device("android://127.0.0.1:5037/"+device2)#連接設(shè)備2poco1 = AndroidUiautomationPoco(dev1) #初始化設(shè)備1poco2 = AndroidUiautomationPoco(dev2) #初始化設(shè)備2set_current(device1)#切換到手機(jī)1set_current(device2)切換到手機(jī)2
初始化設(shè)備之后就可以進(jìn)行相關(guān)設(shè)備的poco操作了,舉個(gè)例子:
這個(gè)例子是打開微信,點(diǎn)擊聊天信息中的一個(gè)好友,然后清除好友聊天的例子;
from poco.drivers.android.uiautomation import AndroidUiautomationPocodevice1 = "c17a4cb4" #設(shè)備號(hào)dev1 = connect_device("android://127.0.0.1:5037/"+device1)#連接師傅手機(jī)poco1 = AndroidUiautomationPoco(dev1) #實(shí)例化手機(jī)auto_setup(__file__) def clear_wechat(poco):#清除微信的聊天記錄 start_app("com.tencent.mm")#啟動(dòng)微信 sleep(12)#等待12秒 poco1(text="三星").click()#點(diǎn)擊好友“三星”的聊天 poco1("android.support.v7.widget.LinearLayoutCompat").click()#點(diǎn)擊更多 poco1(text="清空聊天記錄").click()#點(diǎn)擊清空聊天記錄 poco1(text="清空").click()#點(diǎn)擊清空 stop_app("com.tencent.mm")#關(guān)閉微信
如果有很多重復(fù)的操作,可以將這些重復(fù)的操作寫到一個(gè)公用的air文件里面,然后再在用例里面引用這個(gè)公用的air文件的方法就可以:
舉例,有一個(gè)名叫g(shù)ongyou.air的文件,里面有一個(gè)clear_wechat的方法,這個(gè)clear_wechat方法就是一個(gè)清除微信聊天記錄的用例,如果需要在用例中用到這個(gè)clear_wechat,就需要在用例中引用這個(gè)文件,然后倒入這個(gè)引用文件中的clear_wechat方法,如下:
# -*- encoding=utf8 -*-__author__ = "xhong"from airtest.core.api import *from poco.drivers.android.uiautomation import AndroidUiautomationPocofrom poco.exceptions import PocoNoSuchNodeExceptionfrom poco.exceptions import PocoTargetTimeoutST.PROJECT_ROOT = "D:/code/AirtestCase"#引用公用air的路徑using("gongyou.air")from gongyou import clear_wechat
參考:https://www.jianshu.com/p/32d08455e86f
https://blog.csdn.net/sunxitao970324/article/details/105731046
http://testerhome.com/topics/20704
https://cloud.tencent.com/developer/article/1819833
https://zhuanlan.zhihu.com/p/165527546
https://blog.csdn.net/chqj_163/article/details/109242399
AirtestIDE連接安卓真機(jī)及常見問題:
https://www.cnblogs.com/songzhenhua/p/14716116.html
airtest連接設(shè)備黑屏或者運(yùn)行報(bào)錯(cuò)minicap超時(shí)問題:
https://blog.csdn.net/qq_32394351/article/details/112512540
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122497.html
摘要:首先要打開微信,進(jìn)入到指定的群聊,識(shí)別微信紅包執(zhí)行搶紅包的動(dòng)作。是一款基于控件識(shí)別的自動(dòng)化測試框架,目前支持原生原生微信小程序,也可以在其他引擎中自行接入來使用。 showImg(https://segmentfault.com/img/remote/1460000019438856); 目錄:0 引言1 環(huán)境2 需求分析3 前置準(zhǔn)備4 搶紅包流程回顧5 代碼梳理6 后記 0 引言 提...
摘要:代碼運(yùn)行完成以后,微信被打開了。能不能像前面打開知乎一樣,使用這個(gè)屬性呢也行,也不行。滑動(dòng)屏幕使用的命令為,滑動(dòng)屏幕需要使用坐標(biāo)信息。單獨(dú)使用控制手機(jī)在 想開發(fā)網(wǎng)頁爬蟲,發(fā)現(xiàn)被反爬了?想對(duì) App 抓包,發(fā)現(xiàn)數(shù)據(jù)被加密了?不要擔(dān)心,使用 Airtest 開發(fā) App 爬蟲,只要人眼能看到,你就能抓到,最快只需要2分鐘,兼容 Unity3D、Cocos2dx-*、Android 原生 A...
摘要:三性能測試工具官網(wǎng)介紹騰訊開源的的隨身調(diào)測平臺(tái),支持和。官網(wǎng)介紹騰訊游戲部門開發(fā)的移動(dòng)全平臺(tái)性能測試分析工具平臺(tái)。百度的服務(wù)目前主要為收費(fèi)服務(wù)。 隨著移動(dòng)互聯(lián)網(wǎng)的高速發(fā)展,App 應(yīng)用非?;?,測試工程師也會(huì)接觸到各種 app 應(yīng)用。除了人工測試之外,也可以通過一些測試工具來提高我們的測試效率...
摘要:為什么說軟件測試絕不是一件容易的事從以下幾個(gè)方面分析。要學(xué)習(xí)的軟件測試基礎(chǔ)理論多,必須要打好扎實(shí)的理論基礎(chǔ)。 為什么說軟件測試絕不是一件容易的事?從以下幾個(gè)方面分析...
閱讀 1358·2023-04-25 23:42
閱讀 2853·2021-11-19 09:40
閱讀 3532·2021-10-19 11:44
閱讀 3573·2021-10-14 09:42
閱讀 1876·2021-10-13 09:39
閱讀 3843·2021-09-22 15:43
閱讀 678·2019-08-30 15:54
閱讀 1460·2019-08-26 13:32