App自動化測試:等待webview頁面數據加載完成
一、適用場景
App自動化測試時,經常有混合H5頁面的測試場景,該場景下通過Python+Appium自動化測試時用到的方法,與Python+Selenium進行Web端自動化測試時用到的方法相同,都是繼承於WebDriver。
比如元素的三大顯示等待:
1、表示元素被加載 presence_of_element_located()
2、表示元素可以被看見 visibility_of_element_located()
3、等待元素可以被點擊 element_to_be_clickable()
上面三種常用的顯示等待能基本滿足自動化測試需要,但也有特殊場景無法滿足的,如下:
需求:在商品詳情頁點擊“立即購買”,可以購買該商品成功。(該頁面是App內嵌的webview頁面)
在App自動化測試過程中,當進入上面的商品詳情頁時,需要加載大量的詳情數據。但是“立即購買”按鈕先於詳情數據加載完成,所以此時點擊“立即購買”按鈕時,頁面會無任何反應或有錯誤提示,導致自動化測試過程中斷。
通常的解決辦法是設置顯示等待,查找某個元素加載完成后,再點擊“立即購買”按鈕。但存在一個缺陷是,不知道等待商品詳情頁面的哪個元素,因為詳情頁的元素太多,且每次加載情況還不相同。此時需要一個通用的方法,等待頁面所有的數據加載完成,而不管是什么數據。
二、解決辦法
1、封裝一個等待方法
selenium的page_source方法可以獲取到頁面源碼,頁面在加載數據時源碼都是在持續更新的,當頁面數據加載完成時源碼就不會再更新,因此我們可以封裝一個方法,在源碼不再更新時執行下一步操作。
封裝的方法如下:
def wait_data_load(self, boolean=True, wait_time=0.3): """ 等待webview頁面數據加載完成 :param boolean:是否需要滑屏操作,默認需要滑屏 :param wait_time:每次查詢加載狀態的時間間隔 """ old_page = ''
time.sleep(wait_time) new_page = self.driver.page_source while old_page != new_page: if boolean: self.swipe_up() time.sleep(wait_time) old_page = new_page new_page = self.driver.page_source my_log.info("webview頁面數據加載完成") def swipe_up(self): """向上滑動屏幕"""
return self.driver.swipe(self.width() * 0.5, self.height() * 0.9, self.width() * 0.5, self.height() * 0.1)
代碼中self.swipe_up() 是向上滑動手機屏幕的方法,也可以不用加該方法。在每次獲取源碼后加了time.sleep(wait_time)強制等待,是為了加強執行時的穩定性。如果運行的環境網絡狀態很好,可以將強制等待時間設置很短,甚至不設置等待。具體強制等待時間,需要根據頁面加載數據量,當前網絡狀態去設置。
上面的方法試用多個場景后,基本能解決webview頁面加載數據量大,需要等待所有數據加載完成的問題。
2、改進點擊方法
以文中的商品詳情截圖為例,如果不需要在頁面進行其他的操作,只需要點擊“立即購買”按鈕時,可以循環去點擊這個按鈕直至點擊成功。
方法如下:
def wait_click_element_success(self, locater, timeout=30, frequcy=0.5): """ 循環點擊某個元素 :param locater:元素定位器 :param timeout:總超時時間 :param frequcy:等待點擊時間間隔 """ used_time = 0 while used_time < timeout: try: time.sleep(frequcy) self.driver.find_element(*locater).click() return
except: time.sleep(frequcy) used_time += frequcy # 截圖保存, 使用單獨的文件夾存儲截圖,截圖名字加上時間戳
self.screen_shot() raise