很多同學在學習 App 自動化或者在專案中落地實踐 App 自動化時,會發現編寫的自動化指令碼無緣無故的執行失敗、不穩定。
而導致其問題很大原因是因為應用的各種彈窗(升級彈窗、使用過程提示彈窗、評價彈窗等等),比如這樣的:
前言
如果不對這些彈窗進行處理,將會中斷自動化指令碼的執行,從而導致指令碼執行不穩定。
彈窗處理思路
因為彈窗有時候是隨機出現的,並不是按照固定的路徑復現,所以不能按照常規元素定位給點掉。
我們可以利用 try...catch...異常處理機制:當正常元素定位不到時捕獲異常,進入到異常處理場景,再然後定位彈窗元素,存在則點掉。
這裡以 bilibili 的首頁彈窗為例:
對應思路程式碼實現:
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,裡面有各種軟體測試+開發資料和技術可以一起交流學習哦。
最後感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,這些資料,對於【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,雖然不是什麼很值錢的東西,如果你用得到的話可以直接拿走: