python爬蟲基礎12-selenium大全6/8-等待

Selenium筆記(6)等待

本文集連接:https://www.jianshu.com/nb/25338984web

 

簡介

在selenium操做瀏覽器的過程當中,每一次請求url,selenium都會等待頁面加載完畢之後,纔會將操做權限再次交給咱們的程序。ajax

可是,因爲ajax和各類JS代碼的異步加載問題,因此咱們在使用selenium的時候經常會遇到操做的元素尚未加載出來,就會引起報錯。爲了解決這個問題,Selenium提供了幾種等待的方法,讓咱們能夠等待元素加載完畢後,再進行操做。瀏覽器

 

顯式等待

例子

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

driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
try:
   element = WebDriverWait(driver, 10).until(
       EC.presence_of_element_located((By.ID, "myDynamicElement"))
  )
finally:
   driver.quit()

在這個例子中,咱們在查找一個元素的時候,再也不使用find_element_by_*這樣的方式來查找元素,而是使用了WebDriverWaitdom

try代碼塊中的代碼的意思是:在拋出元素不存在異常以前,最多等待10秒。在這10秒中,WebDriverWait會默認每500ms運行一次until之中的內容,而until中的EC.presence_of_element_located則是檢查元素是否已經被加載,檢查的元素則經過By.ID這樣的方式來進行查找。異步

就是說,在10秒內,默認每0.5秒檢查一次元素是否存在,存在則將元素賦值給element這個變量。若是超過10秒這個元素仍不存在,則拋出超時異常。ui

Expected Conditions

Expected Conditions這個類提供了不少種常見的檢查條件能夠供咱們使用。url

  • title_isspa

  • title_containscode

  • presence_of_element_locatedci

  • visibility_of_element_located

  • visibility_of

  • presence_of_all_elements_located

  • text_to_be_present_in_element

  • text_to_be_present_in_element_value

  • frame_to_be_available_and_switch_to_it

  • invisibility_of_element_located

  • element_to_be_clickable

  • staleness_of

  • element_to_be_selected

  • element_located_to_be_selected

  • element_selection_state_to_be

  • element_located_selection_state_to_be

  • alert_is_present

例子:

from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
# 等待直到元素能夠被點擊
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))

 

隱式等待

隱式等待指的是,在webdriver中進行find_element這一類查找操做時,若是找不到元素,則會默認的輪詢等待一段時間。

這個值默認是0,能夠經過如下方式進行設置:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 單位是秒
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
相關文章
相關標籤/搜索