Selenium請求過快 解決方法


 等待界面元素出現

在進行網頁操作的時候,有的元素內容不是可以理解出現的,可能會等待一段時間,比如

百度搜索一個詞語,點擊搜索后,瀏覽器需要把這個搜索請求發送給百度服務器,百度服務

器處理后,再把搜索結果返回

所以,從點擊搜索到得到結果,需要一定的時間

只是通常百度服務器的處理比較快,感覺是立即出現了搜索結果。

百度搜索的每個結果對應界面元素其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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM