Appium隱式等待和顯示等待
在自動化測試指令碼的執行過程中,webdriver操作瀏覽器的時候,對於元素的定位是有一定的超時時間,大致應該在1-3秒的樣子,
如果這個時間內仍然定位不到元素,就會丟擲異常,中止指令碼執行。
我們可以通過在指令碼中設定等待的方式來避免由於網路延遲或瀏覽器卡頓導致的偶然失敗,常用的等待方式有三種:
強制等待
強制等待是利用python語言自帶的time庫中的sleep()方法:
import time
time.sleep(3)
sleep()顧明思義就是睡覺的意思,就是指令碼一旦執行到條語句sleep(10)就睡10s,再執行後面的語句,他是一個強制等待的方式,使得整個指令碼暫停。
但是這種方式會導致這個指令碼執行時間過長,不到萬不得已儘可能少用,特殊情況下,時間設定最好不超過1秒,一般0.5秒。
Appium隱式等待
隱式等待(全域性)driver.implicitly_wait(20)
隱式等待相比強制等待更智慧,顧明思義,在指令碼中我們一般看不到等待語句,但是它會在每個頁面載入的時候自動等待;
隱式等待只需要宣告一次,一般在開啟瀏覽器後進行宣告。宣告之後對整個drvier的生命週期都有效,後面不用重複宣告。
implicitly_wait()方法用來等待頁面載入完成(直觀的就是瀏覽器tab頁上的小圈圈轉完),implicitly_wait(10),超時時間10s,10秒內一旦載入完成,就執行下一條語句;
如果10秒內頁面都沒有載入完,就超時丟擲異常。
但是隱式等待依然存在一個問題,那就是程式會一直等待整個頁面載入完成,也就是一般情況下你看到瀏覽器標籤欄那個小圈不再轉,才會執行下一步,
但有時候頁面想要的元素早就在載入完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步。
所以,這裡webdriver提供了一種更加智慧的等待方式:顯示等待
隱式等待的運用 from selenium import webdriver import unittest class TestBase(unittest.TestCase): def setUp(self): self.driver=webdriver.Chrome() #驅動瀏覽器 self.driver.implicitly_wait(10) #設定隱式等待 self.driver.maximize_window() #最大化瀏覽器 def test(self): print('這是一個測試用例') def tearDown(self): self.driver.quit() if __name__=='__main__': unittest.main()
顯示等待
在一個超時時間範圍內,每隔一段時間去搜索一次元素是否存在,
如果存在返回定位物件,如果不存在直到超時時間到達,報超時異常錯誤。
// 在Appium中用了Selenium中造的輪子(顯示等待) 方法:WebDriverWait(driver, timeout, poll_frequency).until(method) 引數: 1.driver:手機驅動物件 2.timeout:搜尋超時時間 3.poll_frequency:每次搜尋間隔時間,預設時間為0.5s 4.method:定位方法(匿名函式)
匿名函式: lambda x: x 等價於python函式: def test(x): return x
使用示例: from selenium.webdriver.support.wait import WebDriverWait WebDriverWait(driver, timeout, poll_frequency).until(lambda x: x.find_elements_by_id(id_value)) 解釋: 1.x傳入值為:driver,所以才可以使用定位方法. 函式執行過程: 1.例項化WebDriverWait類,傳入driver物件,之後driver物件被賦值給WebDriverWait的一個類變數:self._driver 2.until為WebDriverWait類的方法,until傳入method方法(即匿名函式),之後method方法會被傳入self._driver 3.搜尋到元素後until返回定位物件,沒有搜尋到函式until返回超時異常錯誤.
業務場景: 1.進入設定頁面 2.通過ID定位方式點選搜尋按鈕
程式碼實現:
# 匯入WebDriverWait類,用了selenium中的顯示等待的輪子 from selenium.webdriver.support.wait import WebDriverWait # 超時時間為30s,每隔1秒搜尋一次元素是否存在,如果元素存在返回定位物件並退出 search_button = WebDriverWait(driver, 30, 1).until(lambda x: x.find_elements_by_id(com.android.settings:id/search)) search_button.click() driver.quit()