Python Selenium常見的報(bào)錯(cuò)問(wèn)題以及措施
Selenium的常見報(bào)錯(cuò)主要包括以下幾種
1.NoSuchElementException
當(dāng)Selenium無(wú)法在DOM中找到元素時(shí),會(huì)拋出此異常。這通常是因?yàn)樵夭淮嬖诨蛘唔?yè)面還未完全加載。
解決方法:
- 顯式等待
- 隱式等待
- 越快越慢,越慢越快,快就是慢,就是快,所以越慢就越快。
- 或者把程序放到不同的網(wǎng)絡(luò)的不同的電腦上,多個(gè)網(wǎng)絡(luò)多個(gè)電腦分擔(dān)工作、
2.TimeoutException
當(dāng)?shù)却硞€(gè)條件成立(例如,等待元素加載)的時(shí)間超過(guò)預(yù)設(shè)的最大值時(shí),會(huì)拋出此異常。
解決方法:
- 始終無(wú)法成功等待元素出現(xiàn)就會(huì)出現(xiàn)這個(gè)問(wèn)題
- 很可能是服務(wù)器覺得你這個(gè)客戶端給他帶來(lái)的負(fù)擔(dān)太大了,它受不了了。那么
- 休息一段時(shí)間,它好你也好
3.WebDriverException
當(dāng)與WebDriver通信出現(xiàn)問(wèn)題時(shí),會(huì)拋出此異常。這可能是因?yàn)閃ebDriver服務(wù)未啟動(dòng),或者網(wǎng)絡(luò)連接中斷。
解決方法:
- 總的來(lái)說(shuō)是小問(wèn)題
- 檢查瀏覽器版本,檢查瀏覽器驅(qū)動(dòng)版本,檢查網(wǎng)絡(luò)情況,檢查網(wǎng)絡(luò)代理情況
- 更新Selenium庫(kù)?
4.StaleElementReferenceException
當(dāng)引用的元素已經(jīng)不在DOM中時(shí),會(huì)拋出此異常。這通常是因?yàn)轫?yè)面已經(jīng)刷新或者元素已經(jīng)被刪除。
解決方法:
- 有可能原來(lái)的URL已經(jīng)失效或者過(guò)期了,于是會(huì)自動(dòng)跳轉(zhuǎn)到一個(gè)新的網(wǎng)頁(yè),新的網(wǎng)頁(yè)往往在腳本程序中既定的跪著之外。
- 檢查當(dāng)前URL
- 檢查當(dāng)前標(biāo)簽標(biāo)題
5.NoSuchFrameException
當(dāng)試圖切換到不存在的frame時(shí),會(huì)拋出此異常。
解決方法:
- 嘗試從根節(jié)點(diǎn)重新依次定位到該frame標(biāo)簽
6.NoSuchWindowException
當(dāng)試圖切換到不存在的窗口時(shí),會(huì)拋出此異常。
解決方法:
- 重新獲取有效的標(biāo)簽頁(yè),順便清理一下多余的標(biāo)簽頁(yè)
7.ElementNotVisibleException
當(dāng)試圖與不可見的元素交互時(shí),會(huì)拋出此異常。
解決方法:
- 等待該元素可見
- 使用JavaScript或者jQuery來(lái)改變?cè)氐目梢娦?/li>
- 滾動(dòng)到元素
- 使用ActionChains模擬用戶交互,例如鼠標(biāo)懸停、拖放等
8.ElementNotInteractableException
當(dāng)試圖與不可交互的元素(例如,被禁用的輸入框)交互時(shí),會(huì)拋出此異常。
解決方法:
- 等待元素變?yōu)榭山换?/li>
- 檢查元素是否被其他元素遮擋
- 使用JavaScript進(jìn)行交互(非要硬剛的話)
解決的代碼示例
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語(yǔ)句來(lái)捕獲NoSuchElementException異常,當(dāng)異常發(fā)生時(shí),你可以記錄錯(cuò)誤信息,或者執(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進(jìn)行交互硬剛
element = driver.find_element_by_id("myElement")
driver.execute_script("arguments[0].click();", element)7. 使用JavaScript或者jQuery來(lái)改變?cè)氐目梢娦?/p>
element = driver.find_element_by_id("myElement")
driver.execute_script("arguments[0].style.display = 'block';", element)8. 滾動(dòng)到元素
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. 終極無(wú)敵暴力方法:多次修bug迭代
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
用python對(duì)oracle進(jìn)行簡(jiǎn)單性能測(cè)試
這篇文章主要介紹了用python對(duì)oracle進(jìn)行簡(jiǎn)單性能測(cè)試的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12
python中的單引號(hào)雙引號(hào)區(qū)別知識(shí)點(diǎn)總結(jié)
在本篇文章中小編給大家整理了關(guān)于python中的單引號(hào)雙引號(hào)有什么區(qū)別的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們參考下。2019-06-06
python 實(shí)現(xiàn)矩陣按對(duì)角線打印
今天小編就為大家分享一篇python 實(shí)現(xiàn)矩陣按對(duì)角線打印,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置
我們?cè)谟胢atplotlib繪制圖的時(shí)候總是有各種需求,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib調(diào)整坐標(biāo)軸位置、標(biāo)簽位置和標(biāo)簽方向以及X軸刻度標(biāo)簽位置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
基于Python實(shí)現(xiàn)GeoServer矢量文件批量發(fā)布
由于矢量圖層文件較多,手動(dòng)發(fā)布費(fèi)時(shí)費(fèi)力,python支持的關(guān)于geoserver包又由于年久失修,無(wú)法在較新的geoserver版本中正常使用。本文為大家準(zhǔn)備了Python自動(dòng)化發(fā)布矢量文件的代碼,需要的可以參考一下2022-07-07
利用Python第三方庫(kù)實(shí)現(xiàn)預(yù)測(cè)NBA比賽結(jié)果
今天給大家?guī)?lái)的是關(guān)于Python的相關(guān)知識(shí),文章圍繞著利用Python實(shí)現(xiàn)預(yù)測(cè)NBA比賽結(jié)果展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06

