Python中的Selenium异常处理

  • Post category:Python

当使用Selenium进行爬虫或自动化测试时,有时会遇到各种异常情况,例如浏览器突然崩溃、元素找不到等等。为了保证程序的稳定性和健壮性,需要在代码中加入异常处理语句。本文将详细讲解Python中的Selenium异常处理的完整攻略,以及两个示例说明。

一、常见异常类型

在Selenium中,常见的异常类型有以下几种:

  • NoSuchElementException:当使用find_element_by_*方法查找元素时,如果该元素不存在,就会抛出NoSuchElementException异常;
  • TimeoutException:当等待元素加载超时时,就会抛出TimeoutException异常;
  • StaleElementReferenceException:当操作一个已经不存在的元素,或者操作元素的时候页面元素已经发生变化,就会抛出StaleElementReferenceException异常;
  • InvalidSelectorException:当使用错误的定位器,例如语法错误的xpath表达式,会抛出InvalidSelectorException异常;
  • WebDriverException:当使用Selenium WebDriver实例时,出现的其他未处理异常,都会抛出WebDriverException异常。

二、异常处理语句

在代码中使用try…except语句来捕捉异常,如下所示:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

# 创建浏览器实例
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)

try:
    # 打开网页
    driver.get('https://www.example.com')
    # 查找元素
    element = driver.find_element_by_id('not_exist')
except NoSuchElementException as e:
    print(e)
finally:
    # 关闭浏览器
    driver.quit()

在上述代码中,当页面中不存在id为”not_exist”的元素时,就会捕获NoSuchElementException异常,并输出异常信息。在finally语句块中,使用driver.quit()方法来关闭浏览器,确保程序的资源得到释放。

三、示例说明

接下来,我们来看两个Selenium异常处理的示例说明。

示例一:等待元素加载

在使用Selenium自动化测试过程中,经常需要等待页面元素加载完成后再进行后续操作。可以使用WebDriverWait类来添加等待条件,示例如下:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 创建浏览器实例
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)

try:
    # 打开网页
    driver.get('https://www.example.com')
    # 等待元素加载完成
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'id_of_element')))
except TimeoutException as e:
    print(e)
finally:
    # 关闭浏览器
    driver.quit()

在上述代码中,使用WebDriverWait类来等待id为”id_of_element”的元素加载完成,如果等待超时,则捕获TimeoutException异常,并输出异常信息。

示例二:操作已经失效的元素

有时,页面中的元素会在操作时被删除或被替换,此时再对这些元素进行操作就会捕获StaleElementReferenceException异常。示例如下:

from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException

# 创建浏览器实例
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)

try:
    # 打开网页
    driver.get('https://www.example.com')
    # 查找元素
    element = driver.find_element_by_id('id_of_element')
    # 操作元素
    element.click()
    # 刷新页面
    driver.refresh()
    # 再次查找元素
    element = driver.find_element_by_id('id_of_element')
    # 再次操作元素
    element.click()
except StaleElementReferenceException as e:
    print(e)
finally:
    # 关闭浏览器
    driver.quit()

在上述代码中,我们先查找id为”id_of_element”的元素并对其进行操作,然后刷新页面,并再次查找该元素并操作。在第二次操作时,如果元素已经被删除或被替换,就会捕获StaleElementReferenceException异常,并输出异常信息。

四、总结

Selenium异常处理是保证程序稳定性和健壮性的关键。我们可以使用try…except语句和常见的异常类来处理各种情况下的异常,同时还可以使用WebDriverWait类来添加等待条件,确保程序可以在元素加载完成后再进行后续操作。在实际开发中,需要结合具体场景进行合理地异常处理。