在Windows上實現iOS APP自動化測試:tidevice + WDA + facebook-wda / appium中介紹了使用阿里開源的tidevice 和 facebook-wda實現在Windows上進行iOS APP自動化測試。本文介紹如何使用tidevice + WDA + airtest進行iOS APP自動化測試。
環境准備
本文使用的環境如下:
- Python 3.7.6,Python版本需要3.6+
- tidevice==0.4.14
- WebDriverAgent,下載最新版本進行編譯安裝:https://github.com/appium/WebDriverAgent
- airtest==1.2.2
- iOS 設備: iPhone12 mini(14.6)
- Windows系統版本:Windows 10 家庭中文版
tidevice和WebDriverAgent介紹及安裝可參考Windows上實現iOS APP自動化測試:tidevice + WDA + facebook-wda / appium。
使用USB連接設備,檢測tidevice是否安裝成功:
$ tidevice list
airtest安裝可參考:App自動化測試工具Airtest
airtest iOS 自動化
1. 啟動WDA
獲取設備的udid:
$ tidevice list
查看wda的bundle id:
$ tidevice applist
使用tidevice啟動iOS設備上的WDA應用
$ tidevice -u [設備 udid] wdaproxy -B [wda 的 bundle Id] --port 8100

如果你覺得每次進行自動化測試之前都要手動啟動WDA比較麻煩,可以考慮使用vbs+bat的方式后台啟動WDA,實現方式可參考VBSscript實現后台運行Windows bat腳本。
2. airtest 連接設備
如果要使用airtest IDE來編寫自動化測試腳本,先連接 iOS 設備。
打開Airtest IDE,在右下角【連接iOS設備】中輸入地址:
http+usbmux://00008101-000255021E08001E
# 或者
http://localhost:8100/
00008101-000255021E08001E
是手機的udid,8100是使用tidevice啟動WDA時設置的端口號。


可以使用init_device()或者connect_device()方法連接iOS設備:
# 方法1
init_device(platform="IOS",uuid="http://localhost:8100/")
# 方法2
connect_device("ios:///http://127.0.0.1:8100")
# 方法3
init_device(platform="IOS",uuid="http+usbmux://00008101-000255021E08001E")
3. airtest 自動化
連接上iOS設備后就可以編寫測試用例了, airtest使用的是圖像識別的方法進行元素操作,元素操作方法可參考文章 App自動化測試工具Airtest 。
下面是一個示例腳本:打開【設置】
#!/usr/bin/python3
# @Time: 2021/9/26 13:55
# @File: test_ios_airtest.py
from airtest.core.api import *
from airtest.report.report import simple_report
# auto_setup(__file__, logdir=True, devices=["ios:///http://127.0.0.1:8100",])
auto_setup(__file__, logdir=True)
init_device(platform="IOS",uuid="http://localhost:8100/")
start_app("com.apple.Preferences") # 打開【設置】
touch(Template(r"tpl1632398524727.png", record_pos=(-0.34, 0.236), resolution=(1125, 2436))) # 點擊
# generate html report
simple_report(__file__)
poco iOS自動化
也可以使用poco進行UI元素操作,WDA啟動和連接設備和前面介紹的【airtest iOS 自動化】一樣。連接設備使用airtest提供的方法。
UI 元素可通過在AirtestIDE的Poco 輔助窗查看,注意要選擇iOS。

poco元素操作方法可參考文章 App自動化測試工具Airtest 。
使用AirtestProject進行APP自動化測試時,通常將airtest和poco結合起來使用,下面是一個示例腳本:打開【設置】,檢查軟件版本為14.8
#!/usr/bin/python3
# @Time: 2021/9/26 13:56
# @File: test_ios_poco.py
from airtest.core.api import *
from airtest.report.report import simple_report
from poco.drivers.ios import iosPoco
# 連接設備、初始化日志路徑
auto_setup(__file__, logdir=True)
init_device(platform="IOS",uuid="http://localhost:8100/")
# 打開【設置】
start_app("com.apple.Preferences")
# 初始化ios poco
poco = iosPoco()
# 點擊
poco("通用").click()
poco("關於本機").click()
# 斷言
assert poco('軟件版本').attr('value') == "14.8"
# generate html report
simple_report(__file__)
查看生成的報告:

和facebook-wda庫一起使用
facebook-wda、airtest和poco這3個測試庫可以在一個測試項目中使用,下面結合pytest測試框架,使用這3個庫實現APP自動化測試。
from airtest.core.api import *
from .start_wda import StartWDA
import wda
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from poco.drivers.ios import iosPoco
class TestFacebookWDA():
def setup(self):
self.udid = "00008101-000255021E08001E"
self.wda_bundle_id = "com.facebook.WebDriverAgentRunner.test1.xctrunner"
self.port = 8100 # 8100為啟動WDA設置的端口號
self.app_name = "com.apple.Preferences"
# 啟動WDA
self.wda = StartWDA()
self.wda.stop_wda(self.port)
self.wda.start_wda(self.udid, self.wda_bundle_id, self.port)
# airtest初始化連接設備
init_device(platform="IOS", uuid=f"http://localhost:{self.port}/")
# poco初始化
self.poco = iosPoco()
# facebook-wda連接設備
self.c = wda.Client(f'http://localhost:{self.port}')
self.c.session().app_activate(self.app_name) # 打開設置
# start_app("com.apple.Preferences")
self.c.implicitly_wait(3.0)
def teardown(self):
self.c.session().app_terminate(self.app_name) # 退出設置
def test_demo(self):
self.c.swipe_up()
time.sleep(1)
self.c(name="通用").click()
time.sleep(1)
self.poco("關於本機").click()
assert self.poco('軟件版本').attr('value') == "14.8"
ele = self.c(name="型號名稱", className="XCUIElementTypeCell").wait(timeout=3.0)
assert ele.value == "iPhone 12 mini"
airtest和facebook-wda初始化連接設備(創建session)后,它們向WDA發送命令互不影響。需要注意的是,Android APP自動化測試中,airtest、appium和uiautomator2之間是有沖突的,因為它們安裝在手機上的uiautomator server不一樣,且不能同時運行。