等待
現在的網頁越來越多采用了 Ajax 技術,這樣程序便不能確定何時某個元素完全加載出來了。如果實際頁面等待時間過長導致某個dom元素還沒出來,但是你的代碼直接使用了這個WebElement,那么就會拋出NullPointer的異常。
為了避免這種元素定位困難而且會提高產生 ElementNotVisibleException 的概率。所以 Selenium 提供了兩種等待方式,一種是隱式等待,一種是顯式等待。
隱式等待是等待特定的時間,顯式等待是指定某一條件直到這個條件成立時繼續執行。
1.顯式等待
顯式等待使WebdDriver等待某個條件成立時繼續執行,否則在達到最大時長時拋出超時異常(TimeoutException)。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = 'http://www.baidu.com' driver = webdriver.Firefox() driver.get(url) # 設置顯示等待 el = WebDriverWait(driver, 60, 0.5).until(EC.presence_of_element_located((By.CSS_SELECTOR,'#lh > a:nth-child(3)'))) print (el.text) driver.close()
WebDriverWait類是由WebDirver 提供的等待方法。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過設置時間檢測不到則拋出異常。具體格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
- driver :瀏覽器驅動。
- timeout :最長超時時間,默認以秒為單位。
- poll_frequency :檢測的間隔(步長)時間,默認為0.5S。
- ignored_exceptions :超時后的異常信息,默認情況下拋NoSuchElementException異常。 WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。 until(method, message=‘’) 調用該方法提供的驅動程序作為一個參數,直到返回值為True。 until_not(method, message=‘’) 調用該方法提供的驅動程序作為一個參數,直到返回值為False。
在本例中,通過as關鍵字將expected_conditions 重命名為EC,並調用presence_of_element_located()方法判斷元素是否存在。
2.隱式等待
WebDriver提供了implicitly_wait()方法來實現隱式等待,默認設置為0。如果不設置隱式等待的值,那么當我們進行元素定位的時候,一旦定位不到將會直接報錯出來,而如果我們設置了隱式等待的值,當定位不到元素的時候,程序將在隱式等待設定時間內多次嘗試定位元素,當時間超過設定的隱式等待時間,將會報錯出來,它的用法相對來說要簡單得多。
from selenium import webdriver import time url = 'https://www.amazon.cn/' driver = webdriver.Firefox() driver.get(url) # 設置隱式等待 driver.implicitly_wait(10) driver.quit()
implicitly_wait()默認參數的單位為秒,本例中設置等待時長為10秒。首先這10秒並非一個固定的等待時間,它並不影響腳本的執行速度。其次,它並不針對頁面上的某一元素進行等待。當腳本執行到某個元素定位時,如果元素可以定位,則繼續執行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設在第6秒定位到了元素則繼續執行,若直到超出設置時長(10秒)還沒有定位到元素,則拋出異常。