多裝置相容指令碼,輕鬆拿捏

fishfish-yu發表於2024-06-06

此文章來源於專案官方公眾號:“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的子程序模組 subprocesssubprocess.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

相關文章