此文章來源於專案官方公眾號:“AirtestProject”\
版權宣告:允許轉載,但轉載必須保留原連結;請勿用作商業或者非法用途
一、前言
有比較多同學有提到說能否一個指令碼同時適用於 Android 跟 iOS 裝置,也有同學問是否可以根據不同的 Android 廠商裝置,去執行不同的操作,那麼本週,我們一起探討一下這個問題,如何讓一個指令碼相容更多的機型~
二、如何查詢所連線的裝置資訊
2.1 簡單分辨 iOS 裝置與 Android 裝置
我們在連線完裝置後,可以透過下方的語句查詢到我們所連線裝置時使用的類是什麼,並將該類的名稱返回。
device().__class__.__name__.lower()
在 Airtest 中,Android 裝置以及 iOS 裝置所使用的類不同,並以系統名作為類名稱,所以我們可以直接透過類的名稱將其區分開來。
2.2 分辨不同的 Android 裝置廠商以及裝置型號
Android 裝置廠商比較多,我們可以透過下方的 adb 命令查詢的方式去獲取我們所連線的裝置的相關資訊,我們在控制檯輸入adb shell
,進入 linux 命令列,再輸入下方命令,可以看到有我們所需要的裝置資訊
adb shell
getprop | grep product
但是我們可以根據自己的需求去進行篩選,如我們這裡使用到的裝置品牌以及裝置型號,分別可以透過下方的方式獲取
# 獲取裝置品牌名
adb shell getprop ro.product.brand
# 獲取裝置型號
adb shell getprop ro.product.model
在程式碼中,我們試用python3
的子程序模組 subprocess
的subprocess.check_output([],text=True)
方法去執行 adb 命令,其中text=True
參數列示返回的輸出結果是一個字串,可以直接使用
# 獲取裝置品牌
brand = subprocess.check_output(['adb', 'shell', 'getprop', 'ro.product.brand'], text=True).strip()
# 獲取裝置型號
model = subprocess.check_output(['adb', 'shell', 'getprop', 'ro.product.model'], text=True).strip()
三、分辨 iOS 裝置與 Android 裝置案例
# -*- encoding=utf8 -*-
__author__ = "Airtest"
from airtest.core.api import *
auto_setup(__file__)
# 定義Android操作函式
def android_operate():
start_app("com.miui.player") # 開啟小米音樂APP
sleep(3.0)
wait(Template(r"tpl1717383819774.png", record_pos=(-0.196, -0.251), resolution=(1080, 2400)))
touch(Template(r"tpl1717383706465.png", record_pos=(-0.194, -0.242), resolution=(1080, 2400)))
sleep(3.0)
print("已開啟小米的音樂APP了")
# 定義iOS操作函式
def ios_operate():
from poco.drivers.ios import iosPoco
poco = iosPoco()
poco("播客").click() # 點選播客
sleep(1.0)
poco("女性暢聊健康生活方式 輕鬆溫暖治癒日常煩惱").click() # 點選女性暢聊健康生活方式
sleep(1.0)
print("已開啟iphone的播客APP了")
if __name__ == "__main__":
# 獲取連線的裝置資訊
platform = device().__class__.__name__.lower()
if platform == "android":
print("當前裝置是Android") # 輸出當前裝置是Android
sleep(3.0)
android_operate()
elif platform == "ios":
print("當前裝置是iOS") # 輸出當前裝置是iOS
sleep(3.0)
ios_operate()
else:
print("當前裝置是未知裝置") # 輸出當前裝置是未知裝置
四、Android 裝置分辨不同廠商型號案例
# -*- encoding=utf8 -*-
__author__ = "Airtest"
from airtest.core.api import *
auto_setup(__file__)
import subprocess
def get_android_device_info():
try:
# 使用 adb shell getprop 獲取裝置品牌和型號資訊
brand = subprocess.check_output(['adb', 'shell', 'getprop', 'ro.product.brand'], text=True).strip() # 獲取裝置品牌
model = subprocess.check_output(['adb', 'shell', 'getprop', 'ro.product.model'], text=True).strip() # 獲取裝置型號
return brand, model
except Exception as e:
# 捕獲異常
print(f"An error occurred: {e}")
return None, None
def open_vivo_music():
start_app("com.android.bbkmusic") # 開啟Vivo音樂APP
sleep(3.0)
wait(Template(r"tpl1717383100103.png", record_pos=(-0.376, -0.051), resolution=(720, 1440)))
touch(Template(r"tpl1717383106988.png", record_pos=(-0.375, -0.044), resolution=(720, 1440)))
sleep(3.0)
print("已開啟Vivo的i音樂APP了")
def open_xiaomi_music():
start_app("com.miui.player") # 開啟小米音樂APP
sleep(3.0)
wait(Template(r"tpl1717383819774.png", record_pos=(-0.196, -0.251), resolution=(1080, 2400)))
touch(Template(r"tpl1717383706465.png", record_pos=(-0.194, -0.242), resolution=(1080, 2400)))
sleep(3.0)
print("已開啟小米的音樂APP了")
def open_huawei_music():
start_app("com.android.mediacenter") # 開啟華為音樂APP
sleep(3.0)
wait(Template(r"tpl1717384154362.png", record_pos=(-0.388, 0.02), resolution=(1080, 2340)))
touch(Template(r"tpl1717384181392.png", record_pos=(-0.331, 0.439), resolution=(1080, 2340)))
sleep(3.0)
print("已開啟華為的音樂APP了")
def print_device_info(brand, model):
if brand and model:
print(f"當前裝置品牌: {brand}") # 列印當前裝置品牌
print(f"當前裝置型號: {model}") # 列印當前裝置型號
sleep(3.0)
else:
print("無法獲取裝置品牌和型號") # 列印無法獲取裝置品牌和型號
if __name__ == "__main__":
# 獲取 Android 裝置品牌和型號
brand, model = get_android_device_info() # 獲取裝置品牌和型號
print_device_info(brand, model)
# 將開啟各類品牌手機APP寫成一個字典
music_apps = {
"HUAWEI": open_huawei_music, # 開啟華為音樂APP
"vivo": open_vivo_music, # 開啟Vivo音樂APP
"Xiaomi": open_xiaomi_music # 開啟小米音樂APP
}
#在獲取完裝置品牌後,在字典內找到對應的方法並執行
music_app = music_apps.get(brand)
if music_app:
music_app()
else:
print("沒有該型號適用的方法")
五、小結
我們本週推文主要是介紹瞭如何去分辨所連線的裝置是 Android 裝置還是 iOS 裝置,以及如何分辨 Android 裝置的廠商和型號,根據這些方式,我們可以結合自己的需求,進一步最佳化我們的測試指令碼以及編寫更具有通用性的指令碼。
如果在測試的過程中,遇到了問題,或者有任何想要深入瞭解的知識點,歡迎在官方交流群(526033840)裡告訴我們或者提交 issue,也歡迎大家投稿其他不同的使用小技巧。
AirtestIDE 下載:airtest.netease.com/\
Airtest 教程官網:airtest.doc.io.netease.com/\
搭建企業私有云服務:airlab.163.com/b2b
官方答疑 Q 群:526033840