自動化指令碼不穩定,原來是軟體彈窗惹的禍,2個方法解決!

软件测试潇潇發表於2024-04-19

很多同學在學習 App 自動化或者在專案中落地實踐 App 自動化時,會發現編寫的自動化指令碼無緣無故的執行失敗、不穩定。

而導致其問題很大原因是因為應用的各種彈窗(升級彈窗、使用過程提示彈窗、評價彈窗等等),比如這樣的:

前言

自動化指令碼不穩定,原來是軟體彈窗惹的禍,2個方法解決!

如果不對這些彈窗進行處理,將會中斷自動化指令碼的執行,從而導致指令碼執行不穩定。

彈窗處理思路


因為彈窗有時候是隨機出現的,並不是按照固定的路徑復現,所以不能按照常規元素定位給點掉。

我們可以利用 try...catch...異常處理機制:當正常元素定位不到時捕獲異常,進入到異常處理場景,再然後定位彈窗元素,存在則點掉。


這裡以 bilibili 的首頁彈窗為例:

自動化指令碼不穩定,原來是軟體彈窗惹的禍,2個方法解決!


對應思路程式碼實現:

try {
    driver.findElement(By.id("tv.danmaku.bili:id/drawer_handler")).click();
}catch (Exception e){
    //找不到對應的元素就進入到彈窗的處理機制中來
    driver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"我知道了\")")).click();
    //點完彈窗之後繼續再來點選對應的元素
    driver.findElement(By.id("tv.danmaku.bili:id/drawer_handler")).click();
}

最佳化一


上述方案程式碼通用性不強,程式碼重複量較多,所以可以考慮封裝為單獨的方法:

/**
 * 通用findElement方法封裝,加入了異常彈窗處理
 * @param by 元素定位
 * @return 元素WebElement
 */
public WebElement myFindElement(By by){
    try {
        return driver.findElement(by);
    }catch (Exception e){
        //找不到對應的元素就進入到彈窗的處理機制中來
        //首頁彈窗元素
        driver.findElement(MobileBy.AndroidUIAutomator("new UiSelector().text(\"我知道了\")")).click();
        //點完彈窗之後繼續再來點選對應的元素
        return driver.findElement(by);
    }
}

最佳化二


對彈窗異常處理做了一定封裝,但是還存在一個問題:如果應用有多個地方需要對不同的彈窗進行處理,那麼此方法明顯不滿足。

我們可以考慮增加黑名單機制:將需要處理的彈窗加入到黑名單中,再迴圈遍歷,同時由於有多個彈窗元素需要遍歷定位導致速度很慢,我們可以透過解析 dom 結構(getPageSource)拿到頁面 dom 資訊,再進行判斷:

/**
 * 通用findElement方法封裝,加入了異常彈窗處理
 * @param by 元素定位
 * @return 元素WebElement
 */
public WebElement myFindElement(By by){
    try {
        return driver.findElement(by);
    }catch (Exception e){
        //找不到對應的元素就進入到彈窗的處理機制中來
        //彈窗黑名單列表(Map結構儲存彈窗資訊,其中key為元素在dom中關鍵資訊字串,value為元素定位表示式)
        HashMap<String,By> alertMap = new HashMap<>();
        alertMap.put("text=\"我知道了\"",MobileBy.AndroidUIAutomator("new UiSelector().text(\"我知道了\")"));
        alertMap.put("xxx",MobileBy.id("xxx"));
        alertMap.put("xxx",MobileBy.xpath("xxx"));
        Set<String> allKeys = alertMap.keySet();
        //拿到頁面的dom結構資訊
        String pageSource = driver.getPageSource();
        for (String key:allKeys){
            if(pageSource.contains(key)){
                //點選對應的彈窗元素
                driver.findElement(alertMap.get(key)).click();
            }
        }
        //點完彈窗之後繼續再來點選對應的元素
        return driver.findElement(by);
    }
}

最後的效果:

動圖封面

行動吧,在路上總比一直觀望的要好,未來的你肯定會感 謝現在拼搏的自己!如果想學習提升找不到資料,沒人答疑解惑時,請及時加入扣群:731789136,裡面有各種軟體測試+開發資料和技術可以一起交流學習哦。

最後感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,這些資料,對於【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,雖然不是什麼很值錢的東西,如果你用得到的話可以直接拿走:

如果你想學習軟體測試和需要軟體測試資料,歡迎加入扣扣交流群:731789136,裡面可以免費領取軟體測試+自動化測試資料+軟體測試面試寶典+簡歷模版+實戰專案+面試刷題工具和大佬答疑解惑,我們一起交流一起學習!

相關文章