Python selenium如何設(shè)置等待時(shí)間
我們前面介紹的Selenium的WebDriver測試方法是基于網(wǎng)頁來進(jìn)行的。之前的例子都是用簡單的網(wǎng)頁來操作,可能體會(huì)不到網(wǎng)頁的加載過程,但實(shí)際應(yīng)用過程中,網(wǎng)頁加載是要消耗一定的時(shí)間的。你的腳本已經(jīng)開始運(yùn)行,但你要定位的元素卻還沒加載出來,此時(shí)就會(huì)報(bào)出一個(gè)找不到元素的錯(cuò)誤。顯然,沒有考慮加載時(shí)間的腳本不是一個(gè)成功的腳本。今天我們就來介紹一下如何設(shè)置等待時(shí)間。
等待的三種方法
time.sleep(n)
強(qiáng)制等待n秒。Python本身的函數(shù),包含在time包中,使用前需要導(dǎo)入time包。我們之前的實(shí)例中經(jīng)常會(huì)使用這種等待,方便大家能看清腳本執(zhí)行的結(jié)果。這種等待方法十分笨拙,無論頁面加載得如何,都必須等待n秒,可以說是十分不智能了。
implicitly_wait(n)
最長等待n秒,若n秒內(nèi)頁面加載完成,則提前結(jié)束等待。WebDriver提供的等待方法,也被稱為隱性等待,比強(qiáng)制等待聰明了一點(diǎn),但如果頁面本身包含一個(gè)超大視頻之類的文件,就算我們需要定位的元素在最開始已經(jīng)加載出來,卻依舊要等待所有文件加載結(jié)束之后,腳本才能繼續(xù)執(zhí)行,依舊算是有些弊端。
WebDriverWait(n)
最長等待n秒,n秒內(nèi)每隔一段時(shí)間去檢查需要定位的元素是否存在,若存在則提前結(jié)束等待。也是WebDriver提供的等待方法,也被稱為顯性等待,這種等待比隱性等待更智能了一些,無視整個(gè)頁面的加載,只要需要的元素存在了,就結(jié)束等待。
實(shí)例
強(qiáng)制等待在之前例子中都有使用過了,我們就來看一看WebDriver提供的兩種等待方法
隱性等待
其實(shí)隱性等待在之前的介紹中也有使用過,但沒有特別提到使用的方法。我們這次來打開網(wǎng)易的首頁,這是一個(gè)加載內(nèi)容很多的門戶網(wǎng)站,根據(jù)網(wǎng)速不同,目測大概要10秒左右才能加載完畢,我們把等待時(shí)間設(shè)置為60秒,然后計(jì)算一下從打開頁面到點(diǎn)擊頁面導(dǎo)航欄中的【公開課】按鈕需要多久。
# coding = utf-8 from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(60) #隱性等待時(shí)間60秒 time_start = time.time() #記錄打開頁面時(shí)的時(shí)間 driver.get('https://www.163.com/') driver.find_element_by_id('js_love_url').click() time_end = time.time() #記錄點(diǎn)擊按鈕后的時(shí)間 print('access time is : ', time_end - time_start) #打印時(shí)間差,即實(shí)際消耗時(shí)間 time.sleep(2) #強(qiáng)制等待2秒,為了觀察我們確實(shí)打開了【公開課】頁面 driver.quit()
腳本執(zhí)行結(jié)束可以看到,雖然我們設(shè)置了隱性時(shí)間為60秒,但5秒左右(看我下面的執(zhí)行結(jié)果)頁面已加載完畢,可以點(diǎn)擊【公開課】按鈕。下面是我的一次執(zhí)行結(jié)果,顯示了整個(gè)加載時(shí)間。
>>>access time is : 5.717327117919922
顯性等待
顯性等待使用時(shí)需要導(dǎo)入selenium.webdriver.support.wait.WebDriverWait類,API如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
- driver:不用說了,你定義的WebDriver瀏覽器(Chrome,F(xiàn)irefox等)
- timeout:最長等待時(shí)間,單位為秒
- poll_frequency:間隔查找元素的時(shí)間,默認(rèn)為0.5秒(不設(shè)定就是0.5秒),也就是說默認(rèn)0.5秒去查看一次要查找的元素是否存在,找到了就結(jié)束整個(gè)顯性等待,否則繼續(xù)等待0.5秒再查找一次
- ignored_exceptions=None:超時(shí)發(fā)送的異常信息,默認(rèn)發(fā)送NoSuchElementException
由于顯性等待可能需要確認(rèn)元素是否存在,一般還要配合以下兩個(gè)方法使用
until(method, message='') until_not(method, message='')
- method:until()的method意為將驅(qū)動(dòng)程序提供的方法作為參數(shù)調(diào)用,直到返回為not False,until_not()的method就是直到返回為False
- message:超時(shí)傳的異常信息
注意,method()必須是可調(diào)用的方法,要有__call__()方法。上面的例子,我們重新寫一下。
# coding = utf-8 from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait import time driver = webdriver.Chrome() class button(): def __call__(self, driver): if driver.find_element_by_id('js_love_url'): return True else: return False driver.implicitly_wait(60) time_start = time.time() driver.get('https://www.163.com/') # driver.find_element_by_id('js_love_url').click() WebDriverWait(driver,2,0.5).until(button()) time_end = time.time() print('access time is : ', time_end - time_start) time.sleep(2) driver.quit()
看完這個(gè)例子可能會(huì)有疑問,我顯性等待明明設(shè)置了是2秒,為什么沒有報(bào)錯(cuò)呢。因?yàn)槲覀兺瑫r(shí)也設(shè)置了隱性等待時(shí)間,兩者時(shí)間取最長的等待時(shí)間為實(shí)際等待時(shí)間,因此在這里例子里,等待的時(shí)間還是60秒。
總結(jié)
1、Selenium可以采取三種等待,最智能的為顯性等待WebDriverWait()
2、隱性等待和顯性等待同時(shí)存在時(shí),取兩者中最長的等待時(shí)間為有效等待時(shí)間
3、顯性等待中的until(method())的method()為可調(diào)用方法,可以自己定義,也可以用匿名函數(shù)等方法,這個(gè)我們以后細(xì)談
4、隱性等待設(shè)置一次,即貫穿整個(gè)腳本始終,強(qiáng)制等待則必須在每個(gè)需要等待之處設(shè)置
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
django drf框架中的user驗(yàn)證以及JWT拓展的介紹
這篇文章主要介紹了django drf框架中的user驗(yàn)證以及JWT拓展的介紹,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08python selenium 彈出框處理的實(shí)現(xiàn)
這篇文章主要介紹了python selenium 彈出框處理的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02利用Python自動(dòng)監(jiān)控網(wǎng)站并發(fā)送郵件告警的方法
這篇文章介紹的是通過定時(shí)執(zhí)行python腳本,可以實(shí)現(xiàn)定期批量訪問網(wǎng)站,如果發(fā)現(xiàn)網(wǎng)站打不開,第一時(shí)間發(fā)郵件到管理員郵箱進(jìn)行預(yù)警。有需要的可以參考借鑒。2016-08-0830秒輕松實(shí)現(xiàn)TensorFlow物體檢測
這篇文章主要為大家詳細(xì)介紹了30秒輕松實(shí)現(xiàn)TensorFlow物體檢測,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03使用 NumPy 和 Matplotlib 繪制函數(shù)圖
Matplotlib 是 Python 的繪圖庫。 它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。 它也可以和圖形工具包一起使用,如 PyQt 和 wxPython2021-09-09python簡單實(shí)現(xiàn)插入排序?qū)嵗a
在本篇文章里小編給大家整理了一篇關(guān)于python簡單實(shí)現(xiàn)插入排序?qū)嵗a,有需要的朋友們可以學(xué)習(xí)參考下。2020-12-12python+opencv實(shí)現(xiàn)車道線檢測
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)車道線檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02