等待界面元素出現
在進行網頁操作的時候,有的元素內容不是可以理解出現的,可能會等待一段時間,比如
百度搜索一個詞語,點擊搜索后,瀏覽器需要把這個搜索請求發送給百度服務器,百度服務
器處理后,再把搜索結果返回
所以,從點擊搜索到得到結果,需要一定的時間
只是通常百度服務器的處理比較快,感覺是立即出現了搜索結果。
百度搜索的每個結果對應界面元素其ID分別是數字1,2,3,4.....
如下:
過快請求實例:
from selenium import webdriver # 導包
import time
# 實例化瀏覽器 如果為空就是是用的項目根目錄的Chrome驅動
borwser = webdriver.Chrome()
# 請求網址
borwser.get('https://www.baidu.com')
ele = borwser.find_element_by_id('kw')
ele.send_keys('老祝頭博客園')
cl = borwser.find_element_by_id('su').click()
eles = borwser.find_element_by_id('1')
print(eles.text)
運行會拋出如下異常:
在短暫的瞬間,網頁上是沒有id為1的元素的(因為還沒搜索到結果)自然會報錯id為1的元素不存在
如果用 sleep等待幾秒鍾,等百度服務返回結果后再去選擇元素,那樣會浪費大量時間
Selenium提供了一個更合理的解決方案:
當發現元素沒有找到的時候,並不立即返回找不到元素的錯誤。
而是周期性(每隔半秒)重新查找該元素,直到找到該元素
或者超出指定最大等待時間,才拋出異常,(若是find_elements 方法,則返回空列表)
Selenium 的 Webdrive 對象有一個方法: implictly_wait(隱式等待)
該方法接收一個參數用來指定最大等待時間。
實例代碼:
borwser.implicitly_wait(10)
后續的 find_element 等方法的調用都會采用上面的策略;
此方法會偷偷的設置等待時間 每隔半秒再找元素 最大上限為10秒
實例代碼:
from selenium import webdriver # 導包
# 實例化瀏覽器 如果為空就是是用的項目根目錄的Chrome驅動
borwser = webdriver.Chrome()
# 請求網址
borwser.get('https://www.baidu.com')
# 隱式等待 每隔半秒請求
borwser.implicitly_wait(10)
ele = borwser.find_element_by_id('kw')
ele.send_keys('老祝頭博客園')
cl = borwser.find_element_by_id('su').click()
eles = borwser.find_element_by_id('1')
print(eles.text)