Python Selenium常见的报错问题以及措施
作者:CCSBRIDGE
这篇文章主要介绍了Python Selenium常见的报错问题以及措施,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Selenium的常见报错主要包括以下几种
1.NoSuchElementException
当Selenium无法在DOM中找到元素时,会抛出此异常。这通常是因为元素不存在或者页面还未完全加载。
解决方法:
- 显式等待
- 隐式等待
- 越快越慢,越慢越快,快就是慢,就是快,所以越慢就越快。
- 或者把程序放到不同的网络的不同的电脑上,多个网络多个电脑分担工作、
2.TimeoutException
当等待某个条件成立(例如,等待元素加载)的时间超过预设的最大值时,会抛出此异常。
解决方法:
- 始终无法成功等待元素出现就会出现这个问题
- 很可能是服务器觉得你这个客户端给他带来的负担太大了,它受不了了。那么
- 休息一段时间,它好你也好
3.WebDriverException
当与WebDriver通信出现问题时,会抛出此异常。这可能是因为WebDriver服务未启动,或者网络连接中断。
解决方法:
- 总的来说是小问题
- 检查浏览器版本,检查浏览器驱动版本,检查网络情况,检查网络代理情况
- 更新Selenium库?
4.StaleElementReferenceException
当引用的元素已经不在DOM中时,会抛出此异常。这通常是因为页面已经刷新或者元素已经被删除。
解决方法:
- 有可能原来的URL已经失效或者过期了,于是会自动跳转到一个新的网页,新的网页往往在脚本程序中既定的跪着之外。
- 检查当前URL
- 检查当前标签标题
5.NoSuchFrameException
当试图切换到不存在的frame时,会抛出此异常。
解决方法:
- 尝试从根节点重新依次定位到该frame标签
6.NoSuchWindowException
当试图切换到不存在的窗口时,会抛出此异常。
解决方法:
- 重新获取有效的标签页,顺便清理一下多余的标签页
7.ElementNotVisibleException
当试图与不可见的元素交互时,会抛出此异常。
解决方法:
- 等待该元素可见
- 使用JavaScript或者jQuery来改变元素的可见性
- 滚动到元素
- 使用ActionChains模拟用户交互,例如鼠标悬停、拖放等
8.ElementNotInteractableException
当试图与不可交互的元素(例如,被禁用的输入框)交互时,会抛出此异常。
解决方法:
- 等待元素变为可交互
- 检查元素是否被其他元素遮挡
- 使用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
异常,当异常发生时,你可以记录错误信息,或者执行其他的恢复操作。
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. 等待元素变为可交互
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. 模拟复杂的用户交互
from selenium.webdriver import ActionChains element = driver.find_element_by_id("myElement") actions = ActionChains(driver) actions.move_to_element(element).perform()
10. 终极无敌暴力方法:多次修bug迭代
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。