Python Selenium常見的報錯問題以及措施
Selenium的常見報錯主要包括以下幾種
1.NoSuchElementException
當Selenium無法在DOM中找到元素時,會拋出此異常。這通常是因為元素不存在或者頁面還未完全加載。
解決方法:
- 顯式等待
- 隱式等待
- 越快越慢,越慢越快,快就是慢,就是快,所以越慢就越快。
- 或者把程序放到不同的網(wǎng)絡(luò)的不同的電腦上,多個網(wǎng)絡(luò)多個電腦分擔工作、
2.TimeoutException
當?shù)却硞€條件成立(例如,等待元素加載)的時間超過預(yù)設(shè)的最大值時,會拋出此異常。
解決方法:
- 始終無法成功等待元素出現(xiàn)就會出現(xiàn)這個問題
- 很可能是服務(wù)器覺得你這個客戶端給他帶來的負擔太大了,它受不了了。那么
- 休息一段時間,它好你也好
3.WebDriverException
當與WebDriver通信出現(xiàn)問題時,會拋出此異常。這可能是因為WebDriver服務(wù)未啟動,或者網(wǎng)絡(luò)連接中斷。
解決方法:
- 總的來說是小問題
- 檢查瀏覽器版本,檢查瀏覽器驅(qū)動版本,檢查網(wǎng)絡(luò)情況,檢查網(wǎng)絡(luò)代理情況
- 更新Selenium庫?
4.StaleElementReferenceException
當引用的元素已經(jīng)不在DOM中時,會拋出此異常。這通常是因為頁面已經(jīng)刷新或者元素已經(jīng)被刪除。
解決方法:
- 有可能原來的URL已經(jīng)失效或者過期了,于是會自動跳轉(zhuǎn)到一個新的網(wǎng)頁,新的網(wǎng)頁往往在腳本程序中既定的跪著之外。
- 檢查當前URL
- 檢查當前標簽標題
5.NoSuchFrameException
當試圖切換到不存在的frame時,會拋出此異常。
解決方法:
- 嘗試從根節(jié)點重新依次定位到該frame標簽
6.NoSuchWindowException
當試圖切換到不存在的窗口時,會拋出此異常。
解決方法:
- 重新獲取有效的標簽頁,順便清理一下多余的標簽頁
7.ElementNotVisibleException
當試圖與不可見的元素交互時,會拋出此異常。
解決方法:
- 等待該元素可見
- 使用JavaScript或者jQuery來改變元素的可見性
- 滾動到元素
- 使用ActionChains模擬用戶交互,例如鼠標懸停、拖放等
8.ElementNotInteractableException
當試圖與不可交互的元素(例如,被禁用的輸入框)交互時,會拋出此異常。
解決方法:
- 等待元素變?yōu)榭山换?/li>
- 檢查元素是否被其他元素遮擋
- 使用JavaScript進行交互(非要硬剛的話)
解決的代碼示例
1. 顯式等待
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.Firefox() 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()
2. 隱式等待
from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")
3. 使用try/except
語句來捕獲NoSuchElementException
異常,當異常發(fā)生時,你可以記錄錯誤信息,或者執(zhí)行其他的恢復(fù)操作。
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: myDynamicElement = driver.find_element_by_id("myDynamicElement") except NoSuchElementException: print("Element not found")
4. 等待元素變?yōu)榭山换?/strong>
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, 'myElement')) )
5. 避免元素被其他元素所遮擋
element = driver.find_element_by_id("myElement") driver.execute_script("arguments[0].style.zIndex = 9999;", element)
6. 使用JavaScript進行交互硬剛
element = driver.find_element_by_id("myElement") driver.execute_script("arguments[0].click();", element)
7. 使用JavaScript或者jQuery來改變元素的可見性
element = driver.find_element_by_id("myElement") driver.execute_script("arguments[0].style.display = 'block';", element)
8. 滾動到元素
element = driver.find_element_by_id("myElement") driver.execute_script("arguments[0].scrollIntoView();", element)
9. 模擬復(fù)雜的用戶交互
from selenium.webdriver import ActionChains element = driver.find_element_by_id("myElement") actions = ActionChains(driver) actions.move_to_element(element).perform()
10. 終極無敵暴力方法:多次修bug迭代
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中的單引號雙引號區(qū)別知識點總結(jié)
在本篇文章中小編給大家整理了關(guān)于python中的單引號雙引號有什么區(qū)別的相關(guān)知識點以及實例代碼,需要的朋友們參考下。2019-06-06Python?matplotlib調(diào)整坐標軸位置、標簽位置和標簽方向以及X軸刻度標簽位置
我們在用matplotlib繪制圖的時候總是有各種需求,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib調(diào)整坐標軸位置、標簽位置和標簽方向以及X軸刻度標簽位置的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04基于Python實現(xiàn)GeoServer矢量文件批量發(fā)布
由于矢量圖層文件較多,手動發(fā)布費時費力,python支持的關(guān)于geoserver包又由于年久失修,無法在較新的geoserver版本中正常使用。本文為大家準備了Python自動化發(fā)布矢量文件的代碼,需要的可以參考一下2022-07-07利用Python第三方庫實現(xiàn)預(yù)測NBA比賽結(jié)果
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識,文章圍繞著利用Python實現(xiàn)預(yù)測NBA比賽結(jié)果展開,文中有非常詳細的介紹,需要的朋友可以參考下2021-06-06