如果網站採用了動態html技術,那麼頁面上的部分元素出現時間便不能確定,這個時候就可以設定一個等待時間,強制要求在時間內出現,否則報錯,那麼我可以用等待。
說到等待,又有三種等法,且聽博主一一道來:
1. 強制等待
第一種也是最簡單粗暴的一種辦法就是強制等待time.sleep(10)
。
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.get('https://www.baidu.com/')
sleep(3) # 強制等待3秒再執行下一步
print driver.current_url
driver.quit()複製程式碼
這種等待方式時間到了就執行下個語句,但比較死板,不能保證在等待的時間內元素真正被載入了出來。
2. 隱性等待
第二種辦法叫隱性等待,driver.implicitly_wait(20),這個等待表示在規定的時間內頁面的所有元素都載入完了就執行下一步,否則一直等到時間截止,然後再繼續下一步。
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
driver.implicitly_wait(30) # 隱性等待,最長等30秒
driver.get('https://www.baidu.com/')
print driver.current_url
driver.quit()複製程式碼
這個方法的缺點是你需要的元素已經載入出來了,但頁面還沒有載入完,再需要繼續等待頁面載入完才能執行下一步操作。
3. 顯性等待
第三種辦法就是顯性等待WebDriverWait,配合該類的until()和until_not()方法,就能夠根據判斷條件而進行靈活地等待了。
# 20 表示最長時間 0.5表示重新整理頻率
# By.LINK_TEXT == driver.find_element_by_link_text()
WebDriverWait(driver,20,0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close() 複製程式碼
表示程式每隔x秒去判斷一下指定的元素是否載入完,載入完了就執行下一步,否則繼續每隔x秒去判斷,指定時間截止。如果超時就會丟擲異常。