一、環(huán)境準(zhǔn)備,
1、xcode
2、Airtest
3、python
4、node.js(npm)
5、cnpm
6、ios-deploy
7、brew
8、libimobliedevice依賴庫(kù)(真機(jī))
9、carthage依賴庫(kù)(被webdriveragent使用)
10、在 iOS 設(shè)備上安裝 WebDriverAgent
1)安裝 WebDriverAgent 依賴
# Appium 桌面版本
cd? /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
sh ./Scripts/bootstrap.sh
# Appium 命令行版本
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
sh ./Scripts/bootstrap.sh
2)使用 Xcode 打開 WebDriverAgent 項(xiàng)目:點(diǎn)擊?Finder→前往→前往文件夾…,輸入以下路徑,點(diǎn)擊前往,雙擊文件夾下的?WebDriverAgent.xcodeproj?打開項(xiàng)目
3)在 Xcode 中添加開發(fā)者賬號(hào):點(diǎn)擊上方菜單欄的?Xcode→Preferences→Accounts,點(diǎn)擊左下角的?+?按鈕,選擇?add Apple ID,添加自己的 Apple ID 作為開發(fā)者賬號(hào)
4)編譯 WebDriverAgentLib
5)編譯 WebDriverAgentRunner
6)將 WebDriverAgentRunner 安裝到 iOS 設(shè)備
7)調(diào)用 WebDriverAgent 接口
設(shè)置代理?
iproxy可以將iPhone端口映射到計(jì)算機(jī)端口,然后可以通過(guò)訪問(wèn)計(jì)算機(jī)端口來(lái)訪問(wèn)電話端口。
通常情況下,您需要通過(guò)設(shè)置USB代理來(lái)訪問(wèn)手機(jī)上的代理。您可能無(wú)法直接通過(guò)wifi訪問(wèn)手機(jī)。出于特定原因,請(qǐng)參閱問(wèn)題和詳細(xì)信息。
通過(guò)Homebrew安裝iproxy
$ brew install libimobiledevice
b運(yùn)行iproxy
$ iproxy 8100 8100
啟動(dòng)成功后,您可以嘗試在瀏覽器中訪問(wèn)http://127.0.0.1:8100/status。如果訪問(wèn)成功,并且您可以看到一些json格式的手機(jī)信息,則表示啟動(dòng)成功。此時(shí),請(qǐng)?jiān)L問(wèn)http://127.0.0.1:8100/inspector以查看瀏覽器上投射的iPhone屏幕;接下來(lái)就可以開始執(zhí)行代碼了。
二、本地python環(huán)境運(yùn)行
1、用本地?python?環(huán)境跑?Airtest?或者?poco?腳本之前,需要先安裝上這倆個(gè)庫(kù)(使用?pip install airtest?和?pip install pocoui?來(lái)安裝)。
2、腳本中進(jìn)行設(shè)備連接
# 方法一:在auto_setup()接口添加設(shè)備
auto_setup(__file__,devices=["Android://127.0.0.1:5037/SJE5T17B17"])
auto_setup(__file__,devices=["iOS:///127.0.0.1:8100"])
# 方法二:用connect_device()方法連接設(shè)備
dev = connect_device("Android://127.0.0.1:5037/SJE5T17B17")
# 方法三:用init_device()方法連接設(shè)備
init_device(platform="Android",uuid="SJE5T17B17")
3、檢查圖片地址
程序可以根據(jù)這個(gè)相對(duì)路徑找到截圖文件的原因在于,我們利用?auto_setup(__file__)?初始化腳本的時(shí)候,傳入了一個(gè)?basedir?(參數(shù)值為__file__,即當(dāng)前腳本所在路徑),程序會(huì)默認(rèn)根據(jù)這個(gè)?basedir?去尋找腳本中存在的相對(duì)路徑。
因此我們要把腳本中用到的截圖文件,也復(fù)制到新建項(xiàng)目的所在目錄下,這樣才可以讓程序根據(jù)截圖腳本上的相對(duì)路徑正確找到我們的截圖文件。
當(dāng)然我們也可以選擇把截圖腳本上面的相對(duì)路徑,改成絕對(duì)路徑,這樣程序也能夠根據(jù)絕對(duì)路徑找到我們的截圖文件:
touch(Template(r"D:/test/tpl1590718697837.png", rgb=True, record_pos=(-0.383, 0.717), resolution=(1080, 1920)))
4、生成測(cè)試報(bào)告
# generate html report
from airtest.report.report import simple_report
simple_report(__file__, logpath=True)
其實(shí)我們是希望不論測(cè)試用例能不能執(zhí)行通過(guò),都可以給我們一個(gè)報(bào)告反饋,所以我們可以使用?try-finally?語(yǔ)句,無(wú)論是否發(fā)生異常都將執(zhí)行最后的代碼:
try:
? ? touch(Template(r"tpl1590718697837.png", threshold=0.9, record_pos=(0.378, 0.098), resolution=(1080, 1920)))
finally:
? ? # generate html report
? ? simple_report(__file__, logpath=True)
三、代碼結(jié)構(gòu)

common:封裝了一些通用函數(shù),如獲取圖片地址、上滑、翻頁(yè)等

driver:設(shè)置連接的測(cè)試設(shè)備
page:按頁(yè)面定義,用來(lái)封裝獲取頁(yè)面元素
report:用來(lái)放airtest的測(cè)試報(bào)告及截圖數(shù)據(jù)
resources:airtest框架可以使用圖像識(shí)別進(jìn)行自動(dòng)化,存放測(cè)試圖片
testcase:按頁(yè)面定義,用來(lái)管理case

conftest:配置裝飾器,用于執(zhí)行特定函數(shù)
run:用于啟動(dòng)整個(gè)項(xiàng)目

四、總結(jié)
整個(gè)框架就是基于Pytest的自動(dòng)化管理用例,Airtest的2大定位框架進(jìn)行搭建。
Airtest:對(duì)公眾號(hào)、小程序的元素控件進(jìn)行抓取,可使用Poco定位或Airtest圖像識(shí)別進(jìn)行
Pytest:對(duì)整體用例集、用例進(jìn)行管理;可單條,批量執(zhí)行,分類執(zhí)行等等。