python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Selenium常见报错及措施

Python Selenium常见的报错问题以及措施

作者:CCSBRIDGE

这篇文章主要介绍了Python Selenium常见的报错问题以及措施,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Selenium的常见报错主要包括以下几种

1.NoSuchElementException

当Selenium无法在DOM中找到元素时,会抛出此异常。这通常是因为元素不存在或者页面还未完全加载。    

解决方法:

2.TimeoutException

当等待某个条件成立(例如,等待元素加载)的时间超过预设的最大值时,会抛出此异常。    

解决方法:

3.WebDriverException

当与WebDriver通信出现问题时,会抛出此异常。这可能是因为WebDriver服务未启动,或者网络连接中断。    

解决方法:

4.StaleElementReferenceException

当引用的元素已经不在DOM中时,会抛出此异常。这通常是因为页面已经刷新或者元素已经被删除。    

解决方法:

5.NoSuchFrameException

当试图切换到不存在的frame时,会抛出此异常。    

解决方法:

6.NoSuchWindowException

当试图切换到不存在的窗口时,会抛出此异常。

解决方法:

7.ElementNotVisibleException

当试图与不可见的元素交互时,会抛出此异常。    

解决方法:

8.ElementNotInteractableException

当试图与不可交互的元素(例如,被禁用的输入框)交互时,会抛出此异常。

解决方法:

解决的代码示例

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迭代     

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

您可能感兴趣的文章:
阅读全文