文章目錄
- Airtest的簡介
- 關于自動化測驗
- 市面上常見的UI自動化測驗工具以及優缺點
- 環境的搭建
- Android真機連接
- Android真機USB連接
- 遠程連接
- 無線連接
- 錄制
- 一個簡單的.air 腳本決議
- 什么是.air 腳本
- 初始化環境
- 設備連接
- 模擬點擊
- 安裝包
- Airtest基本操作方法
- 多個手機互動
- case舉例
- 參考其他air檔案的方法
Airtest的簡介
Airtest是網易出品的一款基于影像識別和poco控制元件識別的一款UI自動化測驗工具,Airtest的框架是網易團隊自己開發的一個影像識別框架,這個框架的祖宗就是一種新穎的圖形腳本語言Sikuli,Sikuli這個框架的原理是這樣的,計算機用戶不需要一行行的去寫代碼,而是用螢屏截屏的方式,用截出來的圖形擺列組合成神器的程式,這是Airtest的一部分,
另外,Airtest也基于poco這個U控制元件搜索框架,這個框架也是網易自家的跨平臺U測驗框架,原理類似于appium,通過控制元件的名稱,id之類的來定位目標控制元件,然后呼叫函式方法,例如click(),swip()之類的方法來對目標控制元件進行點擊或者是操作,
關于自動化測驗
概念:自動化測驗,就是把繁雜的人工測驗用例利用自動化測驗工具撰寫成代碼,讓機器代替人工自動跑用例的程序,實際上就是把以人為驅動的測驗行為轉化為機器執行的一種程序,
意義:節省人力、物力、時間、硬體資源等,提升測驗效率,特別對于繁瑣重復的測驗用例,可以使測驗人員更專注于新的測驗模塊的建立和開發,從而提高測驗覆寫率,
市面上常見的UI自動化測驗工具以及優缺點

以上主流工具的優點跟缺點:

相較于以上工具來說,Airtest有以下優點和缺點:

所以其實基于影像識別的Airtest更適合用于游戲測驗多一點,
環境的搭建
1、AirtestIDE的下載
AirtestIDE已經幫你集成了所有的環境,自帶錄制腳本欄,自動生成腳本,自帶編輯器還自帶模擬器,有了一個AirtestIDE就可以輕松簡單的錄制腳本了,下載地址是Airtest的官網:
http://airtest.netease.com/
AirtestIDE的使用教程跟檔案也在下面的連接中:
https://airtest.doc.io.netease.com/
Android真機連接
使用AirtestIDE對Android應用進行自動化測驗時,第一步就需要連接Android設備,
Android真機連接準備:
- 請先安裝手機對應品牌的官方驅動,確保能使用電腦對手機進行USB除錯
- 確保已經打開了手機中的”開發者選項”,并且打開”開發者選項”內的”允許USB除錯”
- 部分手機需要打開”允許模擬位置”、”允許通過USB安裝應用”
- 關閉電腦上已經安裝的手機助手軟體,能避免絕大多數問題,請務必在任務管理器中手工結束手機助手行程
Android真機USB連接

- 請使用USB線連接手機,手機上出現的 允許USB除錯 彈窗點擊 確定,
- 點擊連接面板中的 refresh ADB 按鈕,設備串列將會重繪,
- 點擊串列內對應設備的 Connect 完成連接,
- 若設備未刷出,點擊 refresh ADB 按鈕,
如果遇到連接問題,請查閱Android連接常見問題:https://airtest.doc.io.netease.com/IDEdocs/faq/1_common%20problems/
手機連上Airtest之后,會向手機中安裝2個app,如下:

pocoservice是支撐poco操作的app,yosemite是airtest的輸入法,安裝之后,手機的默認輸入法會變成這個輸入法,如果需要改回來原來的輸入法,需要手動到手機設定里面進行修改;
遠程連接
- 已知IP和埠的遠程設備 ip:port ,AirtestIDE可以直接連接,
- 點開設備窗內的 遠程設備連接 按鈕
- 將 adb connect ip:port 欄位填入填充框內,點擊 連接 按鈕,
- 遠程設備將出現在設備串列中,點擊 connect 按鈕,
無線連接
參考:使用adb無線連接手機
當手機與電腦處在同一個wifi下,即可嘗試無線連接手機了,但是這種方式受限于網路連接的穩定性,可能會出現連接不夠穩定的情況,具體連接操作步驟如下:
- 確保手機開啟了USB除錯選項,并先用USB線將手機和電腦連接起來
- 在電腦端執行命令 adb tcpip 5555 ,其中 5555 是埠號,可以根據自己的需求來指定,5555是默認值
- 獲取手機的IP地址,可以在 手機設定-關于手機-狀態資訊-IP地址 里找到,也可以執行 adb ifconfig 來查看
- 隨后可以拔掉USB線,在AirtestIDE的 遠程設備連接 處輸入 adb connect 手機ip:剛才填入的埠號5555 ,點擊連接,重繪ADB后就能在設備串列中看到連上的設備了
- 如果因為網路波動、重啟ADB等原因導致連接斷開,重新執行一次 adb connect ip:port 即可,

錄制

點擊錄制按鈕,選擇事件進行錄制,可以用滑鼠操作
介紹一下錄制時每一個引數的作用
- touch(): 點擊操作,根據錄制腳本時所截取的影像進行點擊
- wait(): 可以等待畫面中某個圖片出現,如果在指定的時間范圍內匹配到了該圖片,就會回傳圖片所處位置的焦點,否則拋出TargetNotFoundError例外
- swipe():可以從一個位置滑動到另外一個位置
- exists():判斷畫面中是否存在某個圖片,如果匹配到圖片,回傳圖片所處位置的焦點,否則回傳False
- text():輸入文本
- sleep():執行緒掛起
- assert_exists():斷言圖片存在于當前畫面上
- assert_not_exists():斷言圖片不存在
- assert_equal():斷言數值相等
- assert_not_equal():斷言數值不等
- assert_exists()與assert_equal()的區別在于,assert_exists斷言的物件是圖片,assert_equal斷言的物件是數值
可以按照需要的引數進行配置
一個簡單的.air 腳本決議
什么是.air 腳本
在下載解壓 Airtest 腳本的專屬 IDE——AirtestIDE 后,點擊 “新建腳本” 按鈕,默認即可創建一個后綴名為.air的腳本檔案,.air這是 Airtest 腳本的專屬后綴,
讓我們打開剛才新建腳本的檔案夾,可以看到實際上.air腳本檔案是一個普通的檔案夾,里面附帶了一個同名的.py檔案,AirtestIDE 在執行腳本時,實際上執行的是里面的.py檔案,也就是說,Airtest 腳本雖然自帶一個后綴名,然而本質上依然是 Python 腳本,遵循的是 Python 語法,我們可以根據實際需要自由地import其他 Python 第三方庫,
值得注意的是,.air檔案夾中必須要有同名的.py檔案,否則在命令列執行airtest run test.air 這樣的運行指令時會導致失敗,
初始化環境
首先,就像一個普通的 Python 腳本一樣,我們需要在代碼檔案的最開頭部分,寫上from airtest.core.api import *,將 Airtest 的主要 API 都 import 進來,以便在后續腳本中使用這些 API,
auto_setup 是一個用來初始化環境的介面,介面檔案在這里,它接受 4 個引數,我們可以設定當前腳本所在的路徑、指定運行腳本的設備、設定默認的 log 路徑和設定腳本父路徑,
- 如果
auto_setup不傳入任何引數的話,Airtest 將會讀取運行時命令列中傳入的各項引數,來對環境進行初始化, - 在 AirtestIDE 創建腳本時,默認生成的代碼里是最簡單的初始化代碼
auto_setup(__file__),意思是將腳本檔案作為腳本路徑傳入,其他引數內容將默認讀取運行命令列傳入的引數,
腳本運行命令列有兩種形式,命令列中的引數包含device、log等:
- 命令列運行 Airtest 腳本的示例:
>airtest run untitled.air --device Android:///手機設備號 --log log/,
更多使用命令列運行腳本資訊,請參考檔案, - 在使用 AirtestIDE 運行腳本時,會在 “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:///這樣的設備引數,那么腳本在初始化時會自動連上對應的設備,不需要再另外寫代碼連接了, - 如果沒有在初始化時連上設備,可以在腳本代碼中使用
connect_device介面來連接設備, - Airtest 支持在一個腳本里同時連接多個設備,使用
set_current介面可以在多個設備中進行切換,device()介面可以獲取到當前使用中的設備,
模擬點擊
Airtest 作為自動化測驗框架,模擬的是人的操作,常見介面主要有:
touch點擊某個位置,可以設定被點擊的位置、次數、按住時長等引數swipe從一個位置滑動到另外一個位置text呼叫輸入法輸入指定內容keyevent輸入某個按鍵回應,例如回車鍵、洗掉鍵wait等待某個指定的圖片元素出現snapshot對當前畫面截一張圖- 其他
核心 API 請參見這個檔案,在這個檔案頁里出現的 API 都是跨平臺 API,由于我們在代碼的第一行里將airtest.core.api里的介面全部import進來了,因此這些 API 可以在代碼里直接進行呼叫,像這樣:
from airtest.core.api import *
touch((x, y))
在很多介面中,支持傳入Template圖片物件作為引數,在運行時將會去點擊圖片在畫面中的所在位置,類似這樣:
# 等價于 touch((x, y)), (x, y)是圖片所在的中心點
touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
其中,Template物件是一個圖片類,Airtest 會先嘗試在當前畫面中尋找能夠匹配這張圖片的位置,如果找到了,將對這個坐標進行點擊操作,如果找不到,將拋出識別例外,我們將在后文對Template圖片類進行更加詳細的介紹,
安裝包
1)使用 pip 安裝Airtest框架 pip install airtest
2)若運行代碼時,在cv2模塊報 ImportError: DLL load failed: 找不到指定模塊 的錯,如果使用的python版本低于3.7,請直接運行:
pip uninstall opencv-contrib-python
# 若以下安裝陳述句運行失敗,可以嘗試更新pip到最新版本后重試
pip install opencv-contrib-python==3.2.0.7
3)Poco安裝
使用 pip 安裝poco框架 pip install pocoui,請注意庫的名稱為 pocoui,不要填錯,
Airtest基本操作方法
除了跨平臺的API還有平臺特定的API,比如:
airtest.core.android #安卓平臺
airtest.core.ios #蘋果平臺
airtest.core.win #Windows平臺
這里我們來詳細說說這些模塊,
跨平臺API模塊
這里我們要介紹的第一個就是跨平臺模塊:
from airtest.core.api import * #匯入所有方法
1).初始化設備
這里初始化設備我們也有兩種方案,下面請看:
根據設備的UUID來初始化
語法格式:
init_device(platform='Android',uuid='',cap_method=JAVACAP for Android)
#平臺 – Android,IOS或Windows
#uuid –目標設備的uuid,例如,用于Android的serialno,用于Windows的handle,用于iOS的uuid
#kwargs –可選的平臺特定關鍵字args,例如cap_method = JAVACAP for Android
下面我們來列舉一下實體,如下:
init_device(platform='Android',uuid='127.0.0.1:62001',cap_method='JAVACAP')
根據設備的URL來初始化
語法格式如下:
android:/// 連接當前安卓設備
android://adbhost:adbport/serial NO.?cap_method=javacap&touch_method=adb
windows:/// 連接本地桌面程式
ios:/// 連接IOS設備
這里我們主要是傳入了ADB地址,埠和連接的夜神模擬器的序列號而連接上的,具體例子如下:
connect_device('android://127.0.0.1:5037/127.0.0.1:62001?cap_method=javacap&touch_method=adb')
2).回傳當前活動設備
device()

3).設定當前活動設備
有時候如果我們連接了多個設備,我們需要切換的話,就是用這個函式來達到目的,可以使用設備的索引或者設備的序列號來進行切換哦,
set_current(0)
set_current('127.0.0.1:62001')
4).運行環境配置
auto_setup(basedir = None,devices = None,logdir = None,project_root = None,compress = 0 )
basedir 設定當前腳本的所在位置,__file__也可以,
devices 指定運行腳本的設備以串列形式存在
logdir 設定腳本運行時的日志保存路徑,默認為None,設為True可保存
project_root 設定api的專案根目錄
5).開啟并執行遠程Shell命令
shell(cmd) #ls / data / local / tmp
6).在設備上啟動程式
start_app('啟動的應用程式包名')
7).在設備上停止程式
stop_app('啟動的應用程式包名')
8).清除設備上的應用程式資料
clear_app('啟動的應用程式包名')
9).在設備上安裝應用程式
install(filepath='要在目標設備上安裝的檔案的路徑')
10).在設備上卸載應用程式
uninstall('應用程式包名')
11).截圖并保存到檔案中
snapshot(filename='1.jpg',msg='hello',quality=3)
filename:圖片名
msg:螢屏截圖的簡短描述
quality:影像質量,范圍為[1,99]的整數
12).喚醒并解鎖設備
wake('設備')
13).回傳目標設備的主螢屏
home('設備')
14).設備螢屏上執行點擊,滑動,捏,按鍵,輸入操作
click(v=Template(x,y),times=2) #單擊
v:觸摸目標,可以是Template實體,也可以是絕對坐標(x,y)
times:執行多少次觸摸
double_click() #雙擊
swipe(v1,v2)#滑動起點和終點
swipe(v1,vector=(x,y))#沿向量移動,向量可以是坐標也可以是螢屏百分比
#回傳值:原點位置和目標位置
pinch()#捏操作,相當于縮放,引數如下:
in_or_out:放大或縮小
center:默認為None表示螢屏中心
percent:捏動作的螢屏比例,默認值為0.5
keyevent(keyname='Home')#按鍵操作
text('文本')#在設備上輸入文本
15).睡眠,等待
sleep(2)#睡眠兩秒,延遲兩秒
wait(v,timeout,interval,intervalfunc)#等待與設備螢屏上的模板匹配
v:等待的目標物件
timeout:超時時間
interval:嘗試找到匹配項的時間間隔(秒)
intervalfunc:在每次未成功嘗試找到相應匹配項后呼叫
回傳值:匹配目標的坐標
16).檢查給定目標在設備螢屏上是否存在
exists(v)
v:檢查物件
如果找不到目標,則為False,否則回傳目標的坐標
17).在設備螢屏上查找所有出現的目標并回傳其坐標
find_all(v)
v:尋找目標
回傳坐標串列
18).斷言操作
assert_exists(v,msg) #斷言目標存在于設備螢屏上
assert_not_exists(v,msg) #斷言目標在設備螢屏上不存在
v:要檢查的目標
msg:斷言的簡短描述
assert_equal(v1,v2,msg) #斷言兩個值相等
assert_not_equal(v1,v2,msg) #斷言兩個值不相等
v1:第一個值
v2:第二個值
msg:斷言的簡短描述
這里基本上我們就把使用方法說完了,下面我們來進行下實際操作,下一篇文章即將奉上,
- 使用
from airtest.core.api import *
# 通過ADB連接本地Android設備
connect_device("Android:///")
#安裝待測軟體apk,路徑資訊,
install("path/to/your/apk")
#開始運行app
start_app("com.pingan.certicationApp")
#點擊某個圖片,Airtest中基于影像識別語法,圖片自己提供,
touch(Template("image_of_a_button.png"))
#滑動語音,開頭圖片跟結尾圖片
swipe(Template("slide_start.png"), Template("slide_end.png"))
#添加斷言的圖片
assert_exists(Template("success.png"))
#點擊Android上的回傳鍵
#keyevent("BACK")
#點擊Android上的Home鍵回傳
#home()
#uninstall("package_name_of_your_apk")
- poco樣例
# -*- encoding=utf8 -*-
__author__ = "enmonster"
from airtest.core.api import *
auto_setup(__file__)
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)
poco("com.miui.home:id/workspace").offspring("計算器").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(): 提取指定元素的文本內容
attr(‘text’): 通過給定的屬性名檢索ui元素的屬性,如果屬性不存在,則回傳none(屬性有visible、text、type、pos、size、name等)
exists():判斷指定元素是否在當前螢屏上存在,存在true、不存在false
click(): 點擊事件,可使用click(center)、click([0.5,0.5])、focus([0.5,0.5]).click()來點擊控制元件中心位置
rclick():右鍵點擊
double_click():雙擊操作
long_click():長按操作
swipe:滑動事件,如:swipe([0.2, -0.2], duration=1)以45度角滑動,持續1秒鐘
drag:拖拽事件,如:poco(text=‘需要拖動位置’).drag_to(poco(text=‘目標位置’))
focus (local positioning):區域定位,如:poco(‘控制元件地址’).focus(‘center’).click()點擊控制元件中間位置
wait:等待事件,如:poco(‘控制元件地址’).wait(2).click() 控制元件出現就點擊,最多等待2秒
多個手機互動
如果case中涉及到兩個手機互動的,可以在.py檔案中連接多個手機,需要在哪個手機上操作,就需要在腳本中使用set_cerrent()借口來切換到相應的手機上;
device1 = "c17a4cb4" #設備1
device2 = "RKK0217C15003363" #設備2
dev1 = connect_device("android://127.0.0.1:5037/"+device1)#連接設備1
dev2 = connect_device("android://127.0.0.1:5037/"+device2)#連接設備2
poco1 = AndroidUiautomationPoco(dev1) #初始化設備1
poco2 = AndroidUiautomationPoco(dev2) #初始化設備2
set_current(device1)#切換到手機1
set_current(device2)切換到手機2
case舉例
初始化設備之后就可以進行相關設備的poco操作了,舉個例子:
這個例子是打開微信,點擊聊天資訊中的一個好友,然后清除好友聊天的例子;
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
device1 = "c17a4cb4" #設備號
dev1 = connect_device("android://127.0.0.1:5037/"+device1)#連接師傅手機
poco1 = AndroidUiautomationPoco(dev1) #實體化手機
auto_setup(__file__)
def clear_wechat(poco):#清除微信的聊天記錄
start_app("com.tencent.mm")#啟動微信
sleep(12)#等待12秒
poco1(text="三星").click()#點擊好友“三星”的聊天
poco1("android.support.v7.widget.LinearLayoutCompat").click()#點擊更多
poco1(text="清空聊天記錄").click()#點擊清空聊天記錄
poco1(text="清空").click()#點擊清空
stop_app("com.tencent.mm")#關閉微信
參考其他air檔案的方法
如果有很多重復的操作,可以將這些重復的操作寫到一個公用的air檔案里面,然后再在用例里面參考這個公用的air檔案的方法就可以:
舉例,有一個名叫gongyou.air的檔案,里面有一個clear_wechat的方法,這個clear_wechat方法就是一個清除微信聊天記錄的用例,如果需要在用例中用到這個clear_wechat,就需要在用例中參考這個檔案,然后倒入這個參考檔案中的clear_wechat方法,如下:
# -*- encoding=utf8 -*-
__author__ = "xhong"
from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from poco.exceptions import PocoNoSuchNodeException
from poco.exceptions import PocoTargetTimeout
ST.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連接安卓真機及常見問題:
https://www.cnblogs.com/songzhenhua/p/14716116.html
airtest連接設備黑屏或者運行報錯minicap超時問題:
https://blog.csdn.net/qq_32394351/article/details/112512540
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312109.html
標籤:其他
上一篇:介面測驗——介面測驗流程
下一篇:python從原始代碼(matplotlib)到加圖形界面(tkinter),最后到制作軟體(一元二次方程軟體)(如何做一個python軟體)
