Python Selenium常見的報(bào)錯(cuò)問題以及措施
Selenium的常見報(bào)錯(cuò)主要包括以下幾種
1.NoSuchElementException
當(dāng)Selenium無法在DOM中找到元素時(shí),會(huì)拋出此異常。這通常是因?yàn)樵夭淮嬖诨蛘唔撁孢€未完全加載。
解決方法:
- 顯式等待
- 隱式等待
- 越快越慢,越慢越快,快就是慢,就是快,所以越慢就越快。
- 或者把程序放到不同的網(wǎng)絡(luò)的不同的電腦上,多個(gè)網(wǎng)絡(luò)多個(gè)電腦分擔(dān)工作、
2.TimeoutException
當(dāng)?shù)却硞€(gè)條件成立(例如,等待元素加載)的時(shí)間超過預(yù)設(shè)的最大值時(shí),會(huì)拋出此異常。
解決方法:
- 始終無法成功等待元素出現(xiàn)就會(huì)出現(xiàn)這個(gè)問題
- 很可能是服務(wù)器覺得你這個(gè)客戶端給他帶來的負(fù)擔(dān)太大了,它受不了了。那么
- 休息一段時(shí)間,它好你也好
3.WebDriverException
當(dāng)與WebDriver通信出現(xiàn)問題時(shí),會(huì)拋出此異常。這可能是因?yàn)閃ebDriver服務(wù)未啟動(dòng),或者網(wǎng)絡(luò)連接中斷。
解決方法:
- 總的來說是小問題
- 檢查瀏覽器版本,檢查瀏覽器驅(qū)動(dòng)版本,檢查網(wǎng)絡(luò)情況,檢查網(wǎng)絡(luò)代理情況
- 更新Selenium庫?
4.StaleElementReferenceException
當(dāng)引用的元素已經(jīng)不在DOM中時(shí),會(huì)拋出此異常。這通常是因?yàn)轫撁嬉呀?jīng)刷新或者元素已經(jīng)被刪除。
解決方法:
- 有可能原來的URL已經(jīng)失效或者過期了,于是會(huì)自動(dòng)跳轉(zhuǎn)到一個(gè)新的網(wǎng)頁,新的網(wǎng)頁往往在腳本程序中既定的跪著之外。
- 檢查當(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)簽頁,順便清理一下多余的標(biāo)簽頁
7.ElementNotVisibleException
當(dāng)試圖與不可見的元素交互時(shí),會(huì)拋出此異常。
解決方法:
- 等待該元素可見
- 使用JavaScript或者jQuery來改變?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
語句來捕獲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來改變?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. 終極無敵暴力方法:多次修bug迭代
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
用python對(duì)oracle進(jìn)行簡單性能測試
這篇文章主要介紹了用python對(duì)oracle進(jìn)行簡單性能測試的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12python中的單引號(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-06python 實(shí)現(xiàn)矩陣按對(duì)角線打印
今天小編就為大家分享一篇python 實(shí)現(xiàn)矩陣按對(duì)角線打印,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python?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)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04基于Python實(shí)現(xiàn)GeoServer矢量文件批量發(fā)布
由于矢量圖層文件較多,手動(dòng)發(fā)布費(fèi)時(shí)費(fèi)力,python支持的關(guān)于geoserver包又由于年久失修,無法在較新的geoserver版本中正常使用。本文為大家準(zhǔn)備了Python自動(dòng)化發(fā)布矢量文件的代碼,需要的可以參考一下2022-07-07利用Python第三方庫實(shí)現(xiàn)預(yù)測NBA比賽結(jié)果
今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著利用Python實(shí)現(xiàn)預(yù)測NBA比賽結(jié)果展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06