WebDriverAgent xcode16 打包的 app 自動化真多坑(問題篇)

wupengfeng發表於2024-11-12

背景

基於 airtest 維護的 wda 執行的 ios 自動化 iOS-Tagent 地址

import wda #程式碼執行的驅動,需要pip install python-wda

問題的出現

ios 的打包環境的 xcode 升級到 xcode16 之後,ios 自動化全軍覆沒

直觀的問題

  • 原生 exists、click_exists 方法出現混亂,原先不存在的元素,現在變成存在,如影片全屏時的按鈕,點選螢幕後按鈕隱藏了,但是檢視元素會變成存在,且元素在螢幕外
    • 1、開發無果、文件未見 ,準備修改之前自行封裝的 exists、click_exists 方法
    • 2、初步判斷為 xcode16 導致"不可見的也可能變成存在"
if element.exists:
    if element.visible:
  • 修改後大部分 exists 準確,然後出現新問題:"部分元素在舊版 xcode 打包出來的,visible 是 True,新版是的 False"

  • 執行後決定自由選擇 exists 的時候是否需要判斷 visible

#text/label的都不傳find_by_str,指向label
#1、 self.exe_exists("""主動防禦設定,警報聲設定""") 只校驗存在,不管visible
#2、 self.exe_exists("""警報聲設定""") ,強校驗,必須visible==True
#3、 self.exe_exists("""//*[@label="警報聲設定"] ""","""self.driver.xpath('//*[@label="警報聲設定"]') """),str_value可以隨意傳. 強校驗,必須visible==True

def exe_exists(self, str_value, find_by_str='label'):
        #僅核心程式碼
        str_value = str_value
        list1 = []
        list2 = []
        if find_by_str == 'label':
            list = str_value.split(',')
            # 檢查list[0]是否是整數
            if list and list[0].isdigit():#如果是 1,hello,word  ,逗號第一位是數字,後面的hello,word就是一個整體,實際判斷“hello,word”
                # 合併list[1:]為一個字串
                merged = ','.join(list[1:])
                list=[]
                list[0] = merged
            for i in list:
                if self.driver(label=i).exists:
                    if len(list) == 1:  # 只有一個資料時,按嚴格判斷存在,直接失敗
                        if self.driver(label=i).visible:
                            list1.append(i)
                        else:
                            self.add_screenshot_strs(f"visible false{i}")
                            list2.append(i)  # 加到錯誤列表中
                    else:
                        list1.append(i)  # 多條資料時不嚴格,存在就可以
                else:#完全不存在
                    self.add_screenshot_strs(f"完全不存在{i}")
                    list2.append(i)  # 加到錯誤列表中
        else:
            element = eval(find_by_str)#這裡的find_by_str是我封裝過的,實際上是個字串,如 "driver(text="裝置設定")"
            if element.exists:
                if element.visible:
        if len(list2) > 0:
            self.add_screenshot_strs(f"不存在值self.exe_exists(" + ','.join(list2))
  • click_exists 可以過分一點必須 visible==True
def click_exists_screenshot(self, find_by_str, api_value):
    self.add_screenshot_strs(f"click_exists_screenshot({find_by_str},{api_value})")
    element = eval(find_by_str)
    if element.exists:
        if element.visible == True:
            self.screenshot()
            # self.click_screenshot(find_by_str, api_value)#直接去點選 或者直接用下面的原生方法
            element.click_exists()

多次通訊導致速度降低

#原先 
if self.driver(label=i).exists:
    if self.driver(label=i).visible:

#提速
if self.driver(label=i,visible=True).exists:#存在且顯示

執行過程中發現可能 提速後的結果可能不正確,下面 2 種方式,方式 2 得到的 exists 為 False。對比 Xcode15 的 app 版本,確定是 Xcode16 引起的

# 方式1
if self.driver(label="更多日期").exists: #元素審查器看到的值
    if self.driver(label="更多日期").visible:
        print("存在")
# 方式2
if driver(label='更多日期',visible=True).exists:
    print("存在")

繼續補救

for i in list:
    if self.driver(label=i,visible=True).exists:  #優先用提速的方式,提速失敗後,再執行一次未提速的方法
        list1.append(i)
    else:
        if self.driver(label=i).exists:
            if len(list) == 1:  # 只有一個資料時,按嚴格判斷存在,直接失敗
                if self.driver(label=i).visible:
                    list1.append(i)
                else:
                    self.add_screenshot_strs(f"visible false{i}")
                    list2.append(i)  # 加到錯誤列表中
            else:
                list1.append(i)  # 多條資料時不嚴格,存在就可以
        else:#完全不存在
            self.add_screenshot_strs(f"完全不存在{i}")
            list2.append(i)  # 加到錯誤列表中

有其他避坑方式請留言

有其他坑 請留言

相關文章