Airtest1.3.0.1更新了一些iOS設備相關的接口,下面就讓我們看看以後有哪些新功能可以直接用了。
1.install
之前的install()只支持Android裝包,以後也同樣支持iOS啦
from airtest.core.api import *
# 支持ipa包安裝
install(r"D:\demo\qasite.ipa")
# 也支持通過下載鏈接安裝APP
install("http://www.example.com/test.ipa")
運行後會輸出:
Copying '/Users/szh/Downloads/qasite.ipa' to device... [20.4 MB/s 12s] DONE.
Installing 'com.qasite.wechat' '1.1.0'
- CreatingStagingDirectory (5%)
- ExtractingPackage (15%)
- InspectingPackage (20%)
- TakingInstallLock (20%)
- PreflightingApplication (30%)
- InstallingEmbeddedProfile (30%)
- VerifyingApplication (40%)
- CreatingContainer (50%)
- InstallingApplication (60%)
- PostflightingApplication (70%)
- SandboxingApplication (80%)
- GeneratingApplicationMap (90%)
Complete
2.uninstall
之前的uninstall()只支持Android,以後也同樣支持iOS啦
from airtest.core.api import *
# 參數爲Bundle ID即iOS包的包名
uninstall("com.qasite.wechat")
運行後會輸出:
Uninstalling 'com.qasite.wechat'
- RemovingApplication (50%)
- GeneratingApplicationMap (90%)
Complete
3.list_app
列出設備已安裝應用信息
from airtest.core.api import *
dev = device()
all_app = dev.list_app("all")
print(f"all_app:\n{all_app}")
print(f"system_app:\n{dev.list_app('system')}")
user_app = dev.list_app("user")
print(f"user_app:\n{user_app}")
運行後會報錯
Traceback (most recent call last):
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/airtest/cli/runner.py", line 75, in runTest
six.reraise(*sys.exc_info())
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/six.py", line 719, in reraise
raise value
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/airtest/cli/runner.py", line 72, in runTest
exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope)
File "/Users/szh/auto_test/suite_test/suite_test.py", line 26, in <module>
all_app = dev.list_app()
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/airtest/core/ios/ios.py", line 47, in wrapper
return func(self, *args, **kwargs)
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/airtest/core/ios/ios.py", line 850, in list_app
return TIDevice.list_app(self.udid, type=type)
File "/Users/szh/opt/miniconda3/envs/test/lib/python3.8/site-packages/airtest/core/ios/ios.py", line 67, in wrapper
return func(*args, **kwargs)
TypeError: list_app() got an unexpected keyword argument 'type'
這是因爲Airtest1.3.0.1有個Bug,如果你現在的版本是高於此版本的,那相信網易已經修改了。
我們看/your_python_path/site-packages/airtest/core/ios/ios.py中,第850行,寫的是TIDevice.list_app(self.udid, type=type);但110行卻是def list_app(udid, app_type="user"),參數名寫的不一致,一個是app_type,一個是type,統一一下就行了,比如將850行的type改爲app_type。
之後再次運行後會輸出:
[('com.apple.Home', '家庭', '6.0'), ('com.apple.shortcuts', '快捷指令', '5.0'), ('com.google.chrome.ios', 'Chrome', '115.5790.130')]
[('com.apple.Home', '家庭', '6.0'), ('com.apple.CTCarrierSpaceAuth', 'CTCarrierSpaceAuth', '1.0'), ('com.apple.shortcuts', '快捷指令', '5.0'),]
[('com.ownbook.notes', '愛思全能版', '2.2.0'), ('com.google.chrome.ios', 'Chrome', '115.5790.130')]
4.iOS剪切板功能:get_clipboard、set_clipboard
from airtest.core.api import *
set_clipboard("qasite")
text = get_clipboard()
print(f'剪貼板內容:{text}')
運行後會輸出:qasite
主要可以用到:
-
點擊一鍵複製XXX後,以後可以獲取剪切板與文本進行比對了;
-
輸入複製內容:先設置剪切板,再在app上長按,選粘貼
5.tidevice相關接口
其實就是封裝了tidevice的命令,常用接口如下:
-
devices :列出USB連接的所有設備的 UDID 列表
from airtest.core.ios.ios import TIDevice
udid = TIDevice.devices()
print(f"TIDevice.devices():\n{udid}")
輸出
['f83a2d08deb8c22ce6338e35328f5cfcaaf5d3f4']
如果是要查看當前連接的iOS設備,直接這樣獲取即可:print(dev.udid)
-
list_app :列出手機上安裝的應用列表,支持對類型進行篩選,包括 user/system/all
上面Airtest接口中已有,用那個就行了 -
list_wda :列出手機上安裝的所有WDA的 bundleID
一般我們也不會同時裝好多個wda吧,基本不用 -
device_info :獲取手機信息
print(f"TIDevice.device_info():\n{TIDevice.device_info(udid)}")
# 輸出
{'productVersion': '15.7.3', 'productType': 'iPhone9,2', 'modelNumber': 'MNRL2', 'serialNumber': 'F2LSGNHG52', 'timeZone': 'Asia/Shanghai', 'uniqueDeviceID': 'f83a2d08deb8caaf5d3f4', 'marketName': 'iPhone 7 Plus'}
-
install_app :安裝ipa包,支持本地路徑或URL
上面Airtest接口中已有,用那個就行了 -
uninstall_app:卸載 bundle_id 對應的包體
上面Airtest接口中已有,用那個就行了 -
start_app :啓動 bundle_id 對應的包體
原有Airtest接口中已有,用那個就行了 -
stop_app :停止 bundle_id 對應的包體
原有Airtest接口中已有,用那個就行了 -
ps :獲取當前的進程列表
想獲取app包名時,也可以用此方法
print(f"TIDevice.ps():\n{TIDevice.ps(udid)}")
# 輸出
[{'pid': 4848, 'name': 'StoreKitUIService', 'bundle_id': 'com.apple.ios.StoreKitUIService', 'display_name': 'iTunes'}, {'pid': 217, 'name': 'Spotlight', 'bundle_id': 'com.apple.Spotlight', 'display_name': '搜索'}, {'pid': 5176, 'name': 'TestFlight', 'bundle_id': 'com.apple.TestFlight', 'display_name': 'TestFlight'}, {'pid': 7699, 'name': 'AppStore', 'bundle_id': 'com.apple.AppStore', 'display_name': 'App Store'}, {'pid': 5050, 'name': 'SafariViewService', 'bundle_id': 'com.apple.SafariViewService', 'display_name': 'Safari瀏覽器'}, {'pid': 6800, 'name': 'Preferences', 'bundle_id': 'com.apple.Preferences', 'display_name': '設置'}]
-
ps_wda :獲取當前啓動中的WDA列表
暫時沒想到使用場景 -
xctest:啓動WDA
import threading
import time
from airtest.core.ios.ios import TIDevice
wda_bundle_id = TIDevice.list_wda(self.udid)[0]
# 創建一個線程,執行xctest
t = threading.Thread(target=TIDevice.xctest, args=(self.udid, wda_bundle_id), daemon=True)
t.start()
time.sleep(5)
ps_wda = TIDevice.ps_wda(self.udid)
print(ps_wda)
self.assertIn(wda_bundle_id, ps_wda)
time.sleep(5)
# 終止線程
t.join(timeout=3)
---------------------------------------------------------------------------------
關注微信公衆號即可在手機上查閱,並可接收更多測試分享~