日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)

發布時間:2024/9/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 常見痛點

App 自動化測試中有些常見痛點問題,如果框架不能很好的處理,就可能出現元素定位超時找不到的情況,自動化也就被打斷終止了。很容易打消做自動化的熱情,導致從入門到放棄。比如下面的兩個問題:

一是 App 啟動加載時間較久(可能 App 本身加載慢,可能移動設備本身加載應用速度慢,也可能首頁廣告時間較長)。

另一個是各種彈框的出現,廣告彈框,升級彈框,評價彈框等。在框架中如果不能處理好上面的情況,

以雪球 App 出現的幾種彈框舉例:

彈框一:

彈框二:

彈框三:

2、彈框處理

2.1 處理方向

  • 彈框的影響范圍彈框對我們自動化的影響主要是用例執行的打斷,而至于彈框中廣告內容的跳轉或評價信息填寫等屬于另外的測試,因此我們主要是要將彈框處理消失,使應用回到用例執行的 PO;
  • 彈框的消失方式觀察彈框,我們會發現一般為了保證用戶體驗,彈框都會方便用戶進行一鍵消除,例如上述中雪球的各種彈框,可能點擊一個叉號,可能任意點擊其他地方,或者評價框這種直接點擊“下次再說”等。
  • 彈框的處理效果自動化執行的任何時候,任意的彈框都可能出現,在這個時候用例不能失敗,需要將對應的彈框正確處理后繼續執行原用例,原用例的執行過程不受影響。

2.2 處理思路與實操

2.2.1 循環判斷

1. 將需要處理的彈框元素加入到一個黑名單List中,遍歷List,通過findElements方法得到的List大小來判斷彈框元素是否存在,存在即點擊處理

public static void handleAlert(){ List alertBox = new ArrayList<>(); alertBox.add(By.id("ib_close")); //廣告彈框 alertBox.add(By.id("md_buttonDefaultNegative")); //評價彈框 alertBox.forEach(alert->{ By adsLocator = alert; List ads = driver.findElements(adsLocator); if (ads.size() >= 1) { ads.get(0).click(); } }); }

2. 將handleAlert()方法加到driver.findElement方法之前,使定位前先判斷彈框的存在與否并進行處理

public static WebElement findElement(By by) { System.out.println(by); handleAlert(); return driver.findElement(by); }

上述方法初步解決了彈框問題,但是缺點也很明顯。

缺點:每次定位元素前都需要處理彈框,影響執行效率,速度較慢 因此我們引入try catch來解決此問題

2.2.2 try catch 提升效率

我們利用try catch的異常捕獲處理的機制,讓元素僅在定位失敗時才進入彈框處理handleAlert()方法,處理完畢后重新返回driver.findElement(by),對原case元素繼續進行定位執行;這樣就大大提升了處理效率,使處理更為精準。

public static WebElement findElement(By by) { try { System.out.println(by); return driver.findElement(by); } catch (Exception e) { System.out.println("進入彈框處理"); handleAlert(); return driver.findElement(by); } }

遞歸處理:一般情況下我們一次只會出現一個彈框,但是例外的是可能有一個以上的彈框同時出現,這樣的話雖然處理了其中一個彈框,但是剩下的彈框依然會阻斷用例的正常執行,這個時候就可以使用遞歸的方法,在處理完彈框后返回findElement方法自身,繼續進行try catch,使之進入彈框處理邏輯

public static WebElement findElement(By by) { try { System.out.println(by); return driver.findElement(by); } catch (Exception e) { System.out.println("進入彈框處理"); handleAlert(); return findElement(by); } }

注意:

使用遞歸方法后有一個問題,就是假如并不是因為某個彈框的出現而導致的定位失敗,而這個時候通過try catch進入到彈框處理邏輯后,由于并未匹配到彈框元素,所以遞歸就會進入一個死循環,不斷重復著彈框處理的邏輯,所以使用遞歸時我們也需要對其次數進行限制;一般兩個彈框同時出現已經算多的了,所以建議可以將遞歸的次數限制到最多兩次便退出。

static int i = 1;public static WebElement findElement(By by) { try { System.out.println(by); return driver.findElement(by); } catch (Exception e) { if (i > 2){ //設置最多遞歸兩次 i = 1; return driver.findElement(by); } System.out.println("進入彈框處理第"+i+"次"); handleAlert(); i++; return findElement(by); //最后調用自身完成遞歸,防止多彈框同時出現造成定位失敗 }}
2.2.3 PageSource助力效率再提升

按照上面的方法,看似已經很好的解決了彈框的處理,但是可以注意到的是:

  • 在檢查彈框的時候依然使用的是appium的定位,在當前頁面中根據元素的屬性去一一查找定位
  • 所有的黑名單中的彈框都會被定位查找一遍

而我們實際中最想要的也是最有效率的方法應該是:

  • 只有在當前頁面中存在的彈框才對其進行定位、操作、處理。為了達到我們想要的效果,就需要借助于PageSource了。

1)appium的driver提供了一個getPageSource方法,此方法可以在當前頁面可以得到一個文本字符串,也可以理解為當前頁面的xml,我們利用這種xml文本來進行判斷,就比用appium一一定位的方式要快速和精準的多了

String pageSource = driver.getPageSource();

2)設置黑名單,黑名單要使用元素的xpath,用來和PageSource文本做匹配,判斷此彈框是否存在當前頁面

String adBox = "com.xueqiu.android:id/ib_close";String gesturePromptBox = "com.xueqiu.android:id/snb_tip_text";String evaluateBox = "com.xueqiu.android:id/md_buttonDefaultNegative";
3)我們將黑名單中的 xpath作為彈框查找的標記符,另外再定義一個定位符,用來找到彈框后做定位處理使用;這里可以將標記符和定位符存入HashMap中
HashMap map = new HashMap<>();map.put(adBox,By.id("ib_close"));map.put(gesturePromptBox,By.id("snb_tip_text"));map.put(evaluateBox,By.id("md_buttonDefaultNegative"));

4)遍歷map,判斷黑名單彈框元素是否存在于當前pageSource,存在即根據彈框處理方式進行點擊或其他操作(如上述中的新功能提示彈框,點擊彈框自身無法消除,需點擊頁面其余部分方可消除)處理

map.entrySet().forEach(entry ->{ if (pageSource.contains(entry.getKey())){ if (entry.getKey().equals("com.xueqiu.android:id/snb_tip_text")){ System.out.println("gesturePromptBox found"); Dimension size = driver.manage().window().getSize(); //點擊屏幕的中心位置,消除新功能提示彈框 new TouchAction<>(driver).tap(PointOption.point(size.width/2,size.height/2)).perform(); }else { //其余彈框直接點擊消除 driver.findElement(entry.getValue()).click(); } }});
5)最后有一個小技巧,臨時修改隱式等待時間,防止查找黑名單中元素過久,在彈框處理結束后再講隱式等待時間復原;完整的方法實現如下:
//很多彈框的話,最好的是直接定位到到底哪個彈框在界面上,元素的判斷使用xpath public static void handleAlertByPageSource(){ String pageSource = driver.getPageSource();//可以得到一個文本字符串,也可以理解為當前頁面的xml //黑名單 String adBox = "com.xueqiu.android:id/ib_close"; String gesturePromptBox = "com.xueqiu.android:id/snb_tip_text"; String evaluateBox = "com.xueqiu.android:id/md_buttonDefaultNegative"; //將標記和定位符存入map HashMap map = new HashMap<>(); map.put(adBox,By.id("ib_close")); map.put(gesturePromptBox,By.id("snb_tip_text")); map.put(evaluateBox,By.id("md_buttonDefaultNegative")); //臨時修改隱式等待時間,防止查找黑名單中元素過久 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); //遍歷map,判斷黑名單彈框元素是否存在于當前pageSource,存在即點擊處理 map.entrySet().forEach(entry ->{ if (pageSource.contains(entry.getKey())){ if (entry.getKey().equals("com.xueqiu.android:id/snb_tip_text")){ System.out.println("gesturePromptBox found"); Dimension size = driver.manage().window().getSize(); new TouchAction<>(driver).tap(PointOption.point(size.width/2,size.height/2)).perform(); }else { driver.findElement(entry.getValue()).click(); } } }); //判斷完成后將隱式等待時間恢復 driver.manage().timeouts().implicitlyWait(8,TimeUnit.SECONDS); }

6)最后將findElement方法中的handleAlert方法替換為handleAlertByPageSource方法即可

static int i = 1;public static WebElement findElement(By by) { try { System.out.println(by); return driver.findElement(by); } catch (Exception e) { if (i > 2){ //設置最多遞歸兩次 i = 1; return driver.findElement(by); } System.out.println("進入彈框處理第"+i+"次"); handleAlertByPageSource(); i++; return findElement(by); //最后調用自身完成遞歸,防止多彈框同時出現造成定位失敗 }}

3. 首頁判斷

再來解決首頁加載時可能出現的坑。

App 啟動加載時間較久(可能 App 本身加載慢,也可能是移動設備本身加載應用速度慢,也可能首頁廣告時間較長),導致定位超時,用例失敗。對此我們又如下兩步解決辦法。

3.1 首頁元素顯示等待

如標題所述,對首頁進入使用顯示等待,利用搜索控件的出現來判斷是否進入了首頁,這樣不影響其他元素隱式等待的時間,也解決了首頁初始化加載時間過長的問題。

例如雪球僅在進入首頁后會出現 id為user_profile_container的用戶信息控件,那么我們就可以以此為依據來判斷應用是否加載完成進入了首頁。

在啟動方法中加入顯示等待上述首頁控件 30 秒,到控件可被定位時確認進入首頁。

new WebDriverWait(driver,30) .until(ExpectedConditions.visibilityOfElementLocated(By.id("user_profile_container")));

缺點:

但是這樣有個情況不能解決:若加載完成后有彈框出現,可能就一直無法定位到首頁元素,但是實際上已經加載完成,比如下圖的首頁廣告彈框 。

3.2 首頁彈框判斷

文章第二部分介紹了利用 PageSource 來判斷彈框是否存在的方法,在這里依然適用,還是熟悉的味道,還是同樣的套路,將彈框元素 xpath 也加入 PageSource 判斷,這樣無論首頁控件和首頁彈框哪一個被發現,就都可以判斷應用已經加載完成,成功進入首頁,剩下的就可以交給用例和其他處理邏輯了

new WebDriverWait(driver,30) .until(x ->{ String xml = driver.getPageSource(); Boolean checkResult = xml.contains("user_profile_container") || xml.contains("com.xueqiu.android:id/ib_close"); System.out.println("主頁元素查找的結果是:" + checkResult); return checkResult; });

3.3 運行效果展示

好了,經過上面的分析之后,我們終于搞定了入門 APP 自動化測試時的老大難問題。搞定了彈框及首頁啟動時加載完成如何判斷處理。


(文章來源于霍格沃茲測試學院)

總結

以上是生活随笔為你收集整理的app启动页数秒加载 代码_干货 | App 自动化测试痛点(弹框及首页启动加载完成判断处理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: caoporn视频在线| 欧美一区二区三区四 | 麻豆综合 | 成年在线视频 | 日韩黄色一区二区 | 成年人a级片 | 日本一二三区在线视频 | 好吊操视频这里只有精品 | 毛片手机在线 | 一女三黑人理论片在线 | 欧美精品国产一区二区 | 五月婷婷激情在线 | 黄页嫩草 | www.久久.com | 欧美大片xxx | 色欧美色 | 日韩在线一区二区三区 | 无码国产69精品久久久久同性 | 亚洲成人av片| 91麻豆网站 | 色综综| 西西人体www大胆高清 | 国产理论 | 被室友玩屁股(h)男男 | 国产寡妇亲子伦一区二区三区四区 | 少妇av一区二区三区 | 自拍视频在线观看 | 美女啪啪一区二区 | 欧美一区二区在线观看视频 | 日韩久久精品视频 | 看免费的毛片 | 亚洲小说春色综合另类 | 亚洲国产剧情在线观看 | 人成在线观看 | 欧美日韩一区二区精品 | www.日| free性欧美hd精品4k | 观看av | 男人桶进美女尿囗 | 日韩av免费 | 国产亚洲av片在线观看18女人 | 激情播播网 | 国产一级免费 | 水牛影视av一区二区免费 | 懂色aⅴ一区二区三区免费 国产精品99在线观看 | www国产黄色 | va在线看| www.成人网.com| av免费在线观看不卡 | 亚洲 欧美 另类 综合 偷拍 | 狠狠天天 | 欧美一级特黄视频 | 国产一区二区视频免费在线观看 | 少妇紧身牛仔裤裤啪啪 | 欧美精品久久久久久久多人混战 | 国产精品久久久久久久av福利 | 欧美特黄aaa | 一级v片 | 中文无码熟妇人妻av在线 | 欧美一级免费黄色片 | 亚洲午夜精品 | 精品久久精品久久 | 韩国视频一区 | 黄色片免费视频 | 一区二区视频免费看 | 一级久久久| 亚洲一区二区日韩 | 黄色特级大片 | 日本wwww色| 色屁屁一区二区 | 免费看成人啪啪 | 丁香久久| 2020自拍偷拍| 在线欧美成人 | 久久久久精 | 午夜亚洲精品 | 成人网在线视频 | 欧美激情四区 | 日韩精品久久久 | 亚洲av无码国产在丝袜线观看 | 怨女1988国语版在线观看高清 | 亚洲第一二三四区 | 91精品一区二区三区四区 | 日韩插插插| 国产一级片免费在线观看 | 国产精品视频不卡 | 久久精品无码Av中文字幕 | 国产超级av| 在线中文字幕一区二区 | 日韩国产欧美一区二区 | 尤物在线免费视频 | av网页在线观看 | 国产污污网站 | 在线播放日韩av | 国产一卡二卡三卡四卡 | 91精品欧美一区二区三区 | 岛国一区二区三区 | 亚洲精品粉嫩小泬20p | 国产福利一区视频 |