有(yǒu)比較多(duō)同學有(yǒu)提到(dào)說(shuō)能(•±σαnéng)否一(yī)個(gè)腳本同時(shí)适用(yòng)于 An→ ₩droid 跟 iOS 設備,也(yě)★™有(yǒu)同學問(wèn)是(shì)否可(kě)以根據不(bù)¥₹同的(de) Android 廠(chǎng)商∏ γ≥設備,去(qù)執行(xíng)不(bù)同的(de)₽€操作(zuò),那(nà)麽本周,我們一(yī)¥α 起探討(tǎo)一(yī)下(xià)這(zhè)個(↓εgè)問(wèn)題,如(rú)何讓一(♣$§£yī)個(gè)腳本兼容更多(duō)的(de)機(jī)型~
我們在連接完設備後,可(kě)以通(tōng)'♠過下(xià)方的(de)語句查詢到(dào)我們所連接設備時(s¥Ωhí)使用(yòng)的(de)類是(sh<φì)什(shén)麽,并将該類的(de)名稱返回。
device().__class__.__name__.lowδ∑σ≈er()
在 Airtest 中,Android 設備以及 iOS 設±×備所使用(yòng)的(de)類不(bù)同,并以系統名作(zuò)為(w↑♦èi)類名稱,所以我們可(kě)以直接通(tōng)$≤過類的(de)名稱将其區(qū)分(fēn)開(kāi)來(lái≤&)。
Android 設備廠(chǎng)商比較多&¥↓(duō),我們可(kě)以通(tōng)過下(xià)方的(de) adb ∑ 命令查詢的(de)方式去(qù)獲取我們所連接的(de)設備的(de)相(↑"↓↑xiàng)關信息,我們在控制(zhì)台輸入adb♦♣≈ shell,進入 linux 命令行(xín>↕g),再輸入下(xià)方命令,可(kě)以看(kàn)到✔&→(dào)有(yǒu)我們所需要(yào)的(de)設備信₩$¥息。
adb shell getprop | grep ₽™product 但(dàn)是(shì)我們可(kě←)以根據自(zì)己的(de)需求去(qù)進行(¶Ωxíng)篩選,如(rú)我們這(zhè)裡(lǐ)★'↑使用(yòng)到(dào)的(de)設備品牌以及設備$♣÷±型号,分(fēn)别可(kě)以通(tōng)過下(♣πxià)方的(de)方式獲取
# 獲取設備品牌名adb shell getpropβ→ ro.product.brand# 獲取設備型号a©αφ•db shell getprop ro.p±₽π roduct.model 在代碼中,我們使用(yòng) py♥thon3 的(de)子(zǐ)進程模塊 subproce↕♥ss 的(de) subprocess.ch₹♣Ωπeck_output([],text=Tru÷"e) 方法去(qù)執行(xíng) adb 命令,其中 text=True±↔ 參數(shù)表示返回的(de)輸出結果是(shì)一(y₽ ī)個(gè)字符串,可(kě)以直接使用(yòng)
# 獲取設備品牌brand = subprocess✔≥.check_output(['adb', 'shelγ<l', 'getprop', 'ro.prod'&↑γuct.brand'], text=True).strip→§φ() # 獲取設備型号mode★₩l = subprocess.check_output≠δ★(['adb', 'shell', 'get∑ © prop', 'ro.product.model'], ®φtext=True).strip()
# -*- encoding=utf8 -÷↑*-__author__ = "Airtest"from ↕↕ •airtest.core.api import £ *auto_setup(__file__)# 定義And→≈"roid操作(zuò)函數(shù)def&nφ₹δbsp;android_operate():&nb★₩'¥sp; staφ ♦☆rt_app("com.miui.player")&nb₹∑λ"sp; # 打開(kāi)小(xiǎo)米音(yīn)樂 ✘(yuè)APP sleep(≤←λ3.0) β wait(Template(r"tpl171738381¶&9774.png", record_pos=(-0.196, -♠♥±™0.251), resolution=(1080♥φ™, 2400))) &nb±§★sp; touch(Template(r"tpl1♠&∏σ717383706465.png", record_pos=(-0.19♥↕™4, -0.242), resolution=(1080, β₩2400)))  ≈×Ω; sleep(3.0) &✔δnbsp; print("已打開(kāi)小(xiǎo)米↔的(de)音(yīn)樂(yuè)APP了(le)")# ε↕定義iOS操作(zuò)函數(shù)de•₽ &f ios_operate(): &&€♦γnbsp; &nb±sp; from poco.drivers✔♦₹.ios import iosP•oco &nbs•™↔p;poco = iosPoco() &nα₹≥bsp; poco("播客").∞λclick() # 點擊播客 &n ™δbsp; sleep(1.0> ) poco("✘αε女(nǚ)性暢聊健康生(shēng)活方式 輕松溫暖治愈$<α×日(rì)常煩惱").click() & €π∑nbsp;# 點擊女(nǚ)性暢聊健康生(shēng)活方式&nbsβ×✔£p; sוleep(1.0) ±< ≠ print("已打開(kāi)iphone的(de)播>γ客APP了(le)")if __name__ == "_↕↔♦Ω_main__":  <&★; # 獲取連接的(de)設備信息&nbs∞™p; platfoβ&π£rm = device().__class__.__ε£name__.lower()   ε✔↓; if platfσπ♣<orm == "android": &≤δ♣±nbsp; ↓ print("當前設備是(shì)¶•Android") # 輸出當前設備是(shì)A ₹ndroid &☆$₩¶nbsp;  §¥✔;sleep(3.0) &γ¶nbsp; &nb≠>₽★sp; android_operα¥ ate()  αφδ; elif platform ==&n ®bsp;"ios": &£↑¥nbsp; &n$©✔γbsp;print("當前設備是(shì)iOS") ¶♥λ # 輸出當前設備是(shì)iOS &nbs←€←>p; sleep(3.0)&n♦±≤®bsp; &nbs≥★•≥p; ₽'ios_operate() &→nbsp;else: &•γ≥nbsp; print("當$≠≤↓前設備是(shì)未知(zhī)設備") # 輸×₽↑£出當前設備是(shì)未知(zhī)設備
# -*- encoding=utf8 →↑↓ε-*-__author__ = "Airtest"from&nb€'sp;airtest.core.api import *a≠σuto_setup(__file__)import subproc§α±essdef get_andr₽↕oid_device_info(): &λβλ♥nbsp;try:  ≤§; & $∞←nbsp; # 使用(yòng) aαΩdb shell getprop 獲取設備品牌和(hé)型号信息 σ©♠↑; &n≥ λbsp; braδ♠♦•nd = subprocess.check_out<×"put(['adb', 'shell' ♦±σ, 'getprop', ≥☆βσ'ro.product.brand'],♣→Ω¥ text=True).strip() # 獲取設備品牌 ♦> &nb♥÷£∞sp; model = subpr♥↔ocess.check_output(['adb',&nβ§✘♣bsp;'shell', 'getpr ↕op', 'ro.product.model'], te∑®γ¶xt=True).strip()&nbs₽&"p;# 獲取設備型号 &nb•$sp; &n♥÷bsp;return brand, model&nbs¥♣>p; except&n"σbsp;Exception as e: §β♥; &n•Ωγbsp; # 捕獲異常&Ωε♥nbsp; &nβ≥bsp; print(f"An error occ♠ λurred: {e}") &n€★bsp; &n≥® φbsp;return None, Non¥λπedef open_vivo_music(): &n§ bsp; start_app∑∏("com.android.bbkmusic") # 打開(kāi)≠≤Vivo音(yīn)樂(yuè)APP &n♣★bsp;sleep(3.0) <>∏wait(Template(r"tpl1717383100103. ©png", record_pos=(-0.376, ®-0.051), resolution=(720,♠γ♦™ 1440))) &nbs≤≠βγp;touch(Template(r"tpl1717383106988.pn₽>g", record_pos=(-0.375, -0.044)≤∑, resolution=(720, 1440))) &n✘εδbsp; sleep(3.♦>•0) print("已打開€✘ (kāi)Vivo的(de)i音(yīn)樂(yuè)Aλ♦•PP了(le)")def open_₽☆$xiaomi_music(): γ¶≤ start_app("com.↕§φmiui.player") # 打開(kāi)小(xiǎo)米音(y♥δīn)樂(yuè)APP ♣¥↕• sleep(3.0) ✔♦ wait(Template(r"t ¥₽>pl1717383819774.png", record_pos=(-0.19÷×∑<6, -0.251), resolution=(1↓β>↓080, 2400)))  ≠₹σ; touch(Template(r"¥♥" tpl1717383706465.png",↑βδ↔ record_pos=(-0.194, -0.242), reso¶®φlution=(1080, 2400))) &≤ ≠∞nbsp; sleep(3.0)♣™ε print(™♣&"已打開(kāi)小(xiǎo)米的(de)音(yīn)樂(yuè'♠)APP了(le)")def open_huawei_mu∑☆sic(): &n ☆✘bsp;start_app("com.android.mediacente↑≤≈r") # 打開(kāi)華為(wèi)音(yīn)樂(> yuè)APP slee₹&™p(3.0) &nb ≥sp;wait(Template(r"tpl1717384154362≠ >★.png", record_pos=(-0.388♣¶, 0.02), resolutδ" ₹ion=(1080, 2340))) &nbs&×↓♥p; touch(Template(•∞r"tpl1717384181392.png", rec×∑ord_pos=(-0.331, ↔¶0.439), resolution=(1•∏→080, 2340))) &¥εnbsp; sle<→ δep(3.0) pri ©®nt("已打開(kāi)華為(wèi)的(de)音(yīn)樂(yuè)A♠ΩPP了(le)")def print_de"≈↕>vice_info(brand, model):  ←♥; if brand and&n"₹bsp;model: &$ nbsp; print(¶♠ f"當前設備品牌: {brand}") #✔★&∏ 打印當前設備品牌 ₹ &nbs₩ p;print(f"當前設備型号: {model}")&nbs♥♠p;# 打印當前設備型号 ✘ sleep(σ÷☆3.0) else:&n∞₽↕bsp; ≠πσ prin→≥δ≠t("無法獲取設備品牌和(hé)型号") # 打印無法獲取設備品牌和™₹(hé)型号if __name__ == "__main®÷∏__": &nbs♠↕• p;# 獲取 Android 設備品牌和(↔∑hé)型号 brand, >Ωδγmodel = get_android_φ¶device_info() # 獲取設≠₩∑備品牌和(hé)型号 &nbs©♥€∞p; print_device_¥≠αλinfo(brand, model) &n> ♣bsp; # 将打開(kāi)各類品牌手↔™機(jī)APP寫成一(yī)個(gè)字典&nb→ sp; music_a↑₽§×pps = { &nbs→♠p; "H↕☆&UAWEI": open_huawei_music, # ↕₹打開(kāi)華為(wèi)音(yīn)樂±↔λ☆(yuè)APP  γ; &nb±≠sp;"vivo": open_vivo_music, # ↕×₩ 打開(kāi)Vivo音(yīn)樂(y≤&uè)APP &nbλ¥sp; "X®←✔∞iaomi": open_xiaomi_music•φ≈✘ # 打開(kāi)小(xiǎo)米音∞•(yīn)樂(yuè)APP ♥★&$} ≠¥σ #在獲取<§™完設備品牌後,在字典內(nèi)找到(dào)對(duì)應的(de)方法并執®σ$₽行(xíng)  ≥☆≤→;music_app = music_apps.get(brand)&nbsλ'p; &γ↔σ£nbsp;if music_app:&nb↓≤™≥sp; &∑¶↕£nbsp; music_app() &nbs"γΩp; else: &nbs>₹'p; prinα§∑t("沒有(yǒu)該型号适用(yòng)的(de)方法")&nbs←≠p; ≤ ¶
我們本周推文(wén)主要(yào)是(α£shì)介紹了(le)如(rú)何去(qù)分(fēn≥±₽<)辨所連接的(de)設備是(shì) Andro λ♥id 設備還(hái)是(shì) iOS 設備,♦π以及如(rú)何分(fēn)辨 Android 設備的(de)廠(chǎng)♥¥♣✔商和(hé)型号,根據這(zhè)些(xiē)方Ω式,我們可(kě)以結合自(zì)己的(de)需求,進一(yī)步優化(" ₩huà)我們的(de)測試腳本以及編寫更具有(yǒu)通(tōng)用(β×β•yòng)性的(de)腳本。
如(rú)果在測試的(de)過程中,遇到(dà ↓> o)了(le)問(wèn)題,或者有(yǒu)任何想要(yà ¶o)深入了(le)解的(de)知(zhī" )識點,歡迎在官方交流群(526033840)裡(lǐ≠γ≠)告訴我們或者提交 issue,也(yě)歡迎 ↔✘大(dà)家(jiā)投稿其他(tā)不♣∞→(bù)同的(de)使用(yòng)小(xiǎo) σ技(jì)巧。