2 | Airtest介绍和脚本入门
轉載:https://airtest.doc.io.netease.com/tutorial/0_automated_testing/
2 | Airtest介紹和腳本入門
2.1 前言
通過閱讀本小節教程,你將了解以下內容:
一個Airtest腳本例子的詳細解析
如何在Python腳本中調用Airtest接口
圖片語句的參數介紹
2.2 Airtest介紹
Airtest是一款基于Python的、跨平臺的UI自動化測試框架,基于圖像識別原理,適用于游戲和App。
訪問Github上的Airtest源碼地址,可以獲得更多信息,也歡迎各位幫忙完善項目,提交PR,也可以在issues頁面中提交Bug或建議。
2.2.1 如何快速上手
首先,想要編寫Airtest腳本,需要具備基礎的Python語法知識。雖然借助我們的AirtestIDE提供的錄制功能,也能簡單地根據操作步驟錄制出可以回放操作的腳本,但是通常來說,熟練掌握Python語法能夠幫助我們寫出應用更廣泛、更不容易出錯的腳本。
若對Python語法不熟悉,網絡上有不少非常優秀的Python教程可以學習,例如廖雪峰的《Python新手教程》。
關于Airtest項目的安裝、基本使用方法和簡單的例子,請查看Airtest文檔頁的快速上手章節。
2.3 一個簡單的.air腳本解析
2.3.1 什么是.air腳本
在下載解壓Airtest腳本的專屬IDE——AirtestIDE后,點擊“新建腳本”按鈕,默認即可創建一個后綴名為.air的腳本文件,.air這是Airtest腳本的專屬后綴。
讓我們打開剛才新建腳本的文件夾,可以看到實際上.air腳本文件是一個普通的文件夾,里面附帶了一個同名的.py文件,AirtestIDE在執行腳本時,實際上執行的是里面的.py文件。也就是說,Airtest腳本本質上仍是Python腳本,遵循的是Python語法,我們可以根據實際需要自由地import其它Python第三方庫。
值得注意的是,.air文件夾中必須要有同名的.py文件,否則在命令行執行airtest run test.air這樣的運行指令時會導致失敗。
2.3.2 如何使用AirtestIDE錄制Airtest腳本
在觀看本篇教程前,如果你已經閱讀過我們的快速上手教程,應該就知道我們在錄制腳本前需要先連上一個設備。這個設備可以是一臺Android手機、一個Windows窗口、或是iOS設備等等,請參考我們的設備連接文檔,在AirtestIDE里根據需要連接一個設備。
連接設備后,就可以根據Airtest腳本錄制文檔中描述的兩種功能:手工按鍵錄制與自動錄制,來錄制你需要的腳本內容了。
同時可以通過使用Python的判斷、循環等語法,讓腳本實現更加復雜的功能,完成自動化測試的需求。
2.3.3 Airtest腳本示例
這是一個簡單的腳本示例內容:(AirtestIDE中會自動將Template(xxxx)渲染為圖片形式)
# -*- encoding=utf8 -*-
__author__ = "user"
# 初始化環境
from airtest.core.api import *
auto_setup(__file__)
start_app("org.cocos2d.blackjack")
# 模擬點擊
touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
sleep(2)
swipe(Template(r"tpl1561952588795.png", record_pos=(-0.067, 0.134), resolution=(1280, 720)), vector=[0.2783, 0.0374])
wait(Template(r"tpl1561952704834.png", record_pos=(-0.186, -0.093), resolution=(1280, 720)))
keyevent("BACK")
# 一些簡單的邏輯判斷
if exists(Template(r"tpl1559100640980.png", record_pos=(-0.33, -0.105), resolution=(1920, 1080))):
text("test")
# 斷言
assert_exists(Template(r"tpl1561952631660.png", record_pos=(-0.373, -0.108), resolution=(1280, 720)), "驗證內容存在")
stop_app("org.cocos2d.blackjack")
2.3.4 初始化環境
首先,就像一個普通的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-pathAirtestIDE" runner "D:script-pathuntitled.air" --device Android://127.0.0.1:5037/5PZTQWQOGES8RWUG --log "C:UsersusernameAppDataLocalTempAirtestIDEscriptsaa8c71acdfa70c3068b862cb42ffb8dc"
2.3.5 設備連接
在運行時的命令行中如果傳入了類似--device Android:///這樣的設備參數,那么腳本在初始化時會自動連上對應的設備,不需要再另外寫代碼連接了。
如果沒有在初始化時連上設備,可以在腳本代碼中使用connect_device接口來連接設備。
Airtest支持在一個腳本里同時連接多個設備,使用set_current接口可以在多個設備中進行切換,device()接口可以獲取到當前使用中的設備。
2.3.6 模擬點擊
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圖片類進行更加詳細的介紹。
2.3.7 平臺相關的接口
剛才提到的airtest.core.api中的接口,都是跨平臺的,但是每個接口具體支持的平臺可能各不相同。例如,install接口在文檔中的支持平臺一欄里,只有Android,意味著在連了Windows設備(即某個Windows窗口)時,是不能使用這個接口來安裝應用程序的。
具體查看某個接口在某個平臺下的支持情況,請翻閱文檔目錄中的平臺相關的API,根據具體的平臺查找對應的接口,同時,還能發現在不同的平臺下,有一些獨有接口可供調用,例如在Android平臺下:
from airtest.core.api import *
# Android平臺下的touch接口支持額外的參數duration來控制點擊屏幕的時長
# 翻閱airtest.core.android.android中的Android包含的touch方法來獲取更多參數信息
touch((600, 500), duration=1)
# 在Android中,有一個平臺獨有的接口list_app可以列出所有安裝過的應用
dev = device() # 先獲取到當前設備對象,這里的dev即是一個Android對象
print(dev.list_app()) # 然后就可以調用平臺獨有接口了
2.3.8 斷言語句
斷言在單元測試代碼中非常重要,因此建議在我們的腳本里使用斷言語句來判定被測應用當前的狀態是否是我們預期中的狀態。
Airtest提供了assert_exists和assert_not_exists兩個接口,來斷言一張圖片存在或不存在于當前畫面中。
同時,還提供了assert_equal和assert_not_equal兩個語句,來斷言傳入的兩個值相等或者不相等。
2.4 如何在Python腳本中使用Airtest
AirtestIDE在新建腳本時,也能夠直接創建一個.py腳本文件,但是在創建之前會彈出一個設置窗口,要求填寫一些指定的參數。
在我們了解過auto_setup接口后就會知道,這些參數就是為了傳給它,然后初始化Airtest運行環境用的。因此,一個純.py腳本的初始化代碼可以是這樣的:
from airtest.core.api import *
from airtest.cli.parser import cli_setup
if not cli_setup():
auto_setup(__file__, logdir=True, devices=[
"Android:///?cap_method=javacap&ori_method=adbori",
])
# do something
# touch((x, y)
上面這段代碼的意思是說,當使用python xxx.py來運行本文件,且不帶任何命令行參數時,則自動使用auto_setup這個接口來對airtest相關的參數進行初始化。這樣只需要在寫py腳本時,填寫好指定的參數就能直接用python xx.py指令來運行腳本。
同時,原先傳統的airtest run xx.air –-devices Android:///命令行運行方式也不受影響,只要腳本檢測到傳入了命令行參數(即代碼中的if not cli_setup()判斷),就依然優先使用命令行參數來初始化Airtest環境。
當然,熟練掌握API的各位,也可以根據實際需求在自己的Python腳本中調用Airtest API,與使用正常的Python第三方庫方法相同。
2.5 圖片類Template的參數介紹
在AirtestIDE中,帶有截圖的語句是能夠展示出對應的圖片的,方便大家知道這個語句使用的是什么截圖。在編輯器中點擊鼠標右鍵菜單的圖片/代碼模式切換,可以將當前編輯窗口中的代碼切換成純文本代碼,那么我們將會看到,一個touch(圖片)這樣的語句,可能會變成這樣的格式:
touch(Template(r"tpl1556019871196.png", record_pos=(0.204, -0.153), resolution=(1280, 720)))
Template即Airtest封裝的圖片類,運行時會先去讀取這張圖片,然后在當前畫面中找到最符合這張圖片的坐標點,最后才執行touch點擊。
在AirtestIDE中截的圖,默認會自帶3個參數,第一個參數是圖片名;第二個record_pos記錄了截取這張圖片時,它所在的位置;第三個resolution記錄的是截取圖片時,當前畫面的分辨率。
record_pos的作用是,可以讓Airtest在回放腳本時優先在錄制時的位置附近查找,如果找不到符合條件的圖片,再擴大尋找范圍到整個畫面。這樣能夠提升查找圖片的速度和精確度。
resolution記錄的是畫面的分辨率,如果在不同設備上回放腳本,Airtest將會對當前畫面的分辨率按照比例進行一定的縮放,方便圖片的跨分辨率匹配。
雖然直接使用圖片路徑來初始化一個Template類,也同樣能夠運行代碼,但是為了能夠適配更多分辨率的設備,以及提升圖像查找速率,建議各位盡量填寫參數。AirtestIDE截取的圖片將會自動生成對應的參數,如果對截取的圖片不滿意,可以使用圖片編輯器功能對圖片進一步修改。
除了以上三個參數之外,圖片還支持更多參數,對運行過程中的圖像識別閾值、點擊位置和是否灰度進行修改。其中,圖像匹配的閾值threshold值與圖像識別的成功率息息相關,請閱讀文檔獲得更多細節。
2.5.1 圖像識別的全局配置項
在上一小節中,我們介紹了圖像模板類Template的各項參數,當我們修改那些參數時,只有對應的那張圖片會生效,舉個例子:
touch(Template(r"tpl1556019871196.png", threshold=0.9)
在這行代碼中,我們將一張圖片的識別閾值threshold設置為0.9,意思是當識別結果的可信度大于等于90%時,我們才認為這次圖像識別匹配成功,是一個相當嚴格的設置了。
假如我們希望能夠將這個設置擴展到整個腳本中的所有圖片,又不希望挨個修改每張圖片的代碼時,我們可以考慮修改Airtest的全局配置來實現這個需求:
from airtest.core.api import *
# airtest.core.api中包含了一個名為ST的變量,即為全局設置
ST.THRESHOLD = 0.8
# 未指定圖片threshold,默認使用ST.THRESHOLD中的0.8
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264)))
# 手工指定圖片threshold,以圖片設置的0.6為準
touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6))
還有更多可定制的全局配置項,請各位查看腳本全局配置文檔頁來獲取更多配置項的介紹。
2.6 總結
通過閱讀本節教程,希望大家能夠對Airtest腳本有更加深入的印象,它不僅僅能夠在AirtestIDE上通過幾次鼠標點擊來生成錄制腳本,還可以結合Python、運用編程技巧編寫代碼實現更多復雜需求。
總結
以上是生活随笔為你收集整理的2 | Airtest介绍和脚本入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于echart没有数据显示暂无数据
- 下一篇: 笔记本电脑wlan密码怎么改如何改电脑名