Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)
在自動化測試腳本的運行過程中,webdriver操作瀏覽器的時候,對于元素的定位是有一定的超時時間,大致應該在1-3秒的樣子,如果這個時間內仍然定位不到元素,就會拋出異常,中止腳本執行。我們可以通過在腳本中設置等待的方式來避免由于網絡延遲或瀏覽器卡頓導致的偶然失敗,常用的等待方式有三種:
一、強制等待 time.sleep(5)
強制等待是利用python語言自帶的time庫中的sleep()方法:
import time
time.sleep(3)
sleep()顧明思義就是睡覺的意思,就是腳本一旦執行到條語句sleep(10)就睡10s,再執行后面的語句,他是一個強制等待的方式,使得整個腳本暫停。但是這種方式會導致這個腳本運行時間過長,不到萬不得已盡可能少用,特殊情況下,時間設置最好不超過1秒,一般0.5秒。
二、 隱式等待(全局)driver.implicitly_wait(20)
隱式等待相比強制等待更智能,顧明思義,在腳本中我們一般看不到等待語句,但是它會在每個頁面加載的時候自動等待;隱式等待只需要聲明一次,一般在打開瀏覽器后進行聲明。聲明之后對整個drvier的生命周期都有效,后面不用重復聲明。?implicitly_wait()方法用來等待頁面加載完成(直觀的就是瀏覽器tab頁上的小圈圈轉完),implicitly_wait(10),超時時間10s,10秒內一旦加載完成,就執行下一條語句;如果10秒內頁面都沒有加載完,就超時拋出異常。
但是隱式等待依然存在一個問題,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步。所以,這里webdriver提供了一種更加智能的等待方式:顯示等待
隱式等待的運用from selenium import webdriver import unittestclass 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()三、顯示等待 WebDriverWait(driver,30,0.1)
顯示等待與隱式等待相對,顯示等待必須在每個需要等待的元素前面進行聲明。是針對于某個特定的元素設置的等待時間,在設置時間內,默認每隔一段時間檢測一次當前頁面某個元素是否存在,如果在規定的時間內找到了元素,則直接執行,即找到元素就執行相關操作,如果超過設置時間檢測不到則拋出異常。默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException
用法例1: #引入WebDriverWait from selenium.webdriver.support.ui import WebDriverWait #引入expected_conditions類,并重命名為EC from selenium.webdriver.support expected_conditions as EC #引入By類 from selenium.webdriver.common.by import By#設置等待 wait = WebDriverWait(driver,10,0.5) wait.until(EC.presence_of_element_located((By.ID,'KW')))用法例2: loc = ("xpath", "//*[@text='允許']") e = WebDriverWait(driver, 1, 0.5).until(EC.presence_of_element_located(loc)) e.click()顯示等待需要用到兩個類:
WebDriverWait和expected_conditions兩個類。
1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver:瀏覽器驅動
timeout:最長超時時間,默認以秒為單位
poll_frequency:檢測的間隔步長,默認為0.5s
ignored_exceptions:超時后的拋出的異常信息,默認拋出NoSuchElementExeception異常。
WebDriverWait()中的until()和until_not()方法:
until
method: 在等待期間,每隔一段時間(__init__中的poll_frequency)調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not
與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同。
2、expected_conditions類
各種類,達到某種條件,返回True和False
presence_of_element_located?判斷某個元素是否被加到了DOM樹里,并不代表該元素一定可見
visibility_of_element_located判斷某個元素是否可見,可見代表元素非隱藏,并且元素的寬和高都不等于0
關于顯示等待,也可以自己寫條件:
#設置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函數
wait.until(lambda diver:driver.find_element_by_id('kw'))
總結
以上是生活随笔為你收集整理的Appium+PythonUI自动化之webdriver 的三种等待方式(强制等待、隐式等待、显示等待)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据库】Mysql日期/时间相关函数汇
- 下一篇: php带来互联网的影响,网络对我们的影响