You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python+Selenium自定义异常/断言失效问题求助

问题根源

嘿,我一眼就看出问题出在哪了——你捕获错异常类型啦!

你在except块里写的是Python标准库的TimeoutError,但Selenium的WebDriverWait超时后抛出的是它自己定义的selenium.common.exceptions.TimeoutException——这俩是完全不同的异常类,所以你的自定义处理逻辑根本不会被触发,程序只会抛出默认的Selenium超时异常。

另外还有两个小细节需要修正:

  • element_fail函数定义里用了self.con,但它不是测试类的方法,没法直接访问self对象;
  • 调用element_fail()时没传递必要的上下文,导致即使捕获到异常也没法正确执行关闭浏览器的逻辑。
修复步骤

1. 导入并捕获正确的异常类

首先要在文件顶部导入Selenium的TimeoutException,然后在except块里捕获这个异常:

# 记得添加这行导入
from selenium.common.exceptions import TimeoutException

2. 修正函数与调用逻辑

你可以选择把element_fail改成测试类的方法,或者直接简化代码,在异常块里直接调用关闭逻辑:

方法一:把element_fail改成类成员方法

def element_fail(self):
    # 作为测试类的方法,才能访问self.con
    self.con.tearDown()

然后在except块里这样调用:

except TimeoutException:
    print("元素定位超时,执行自定义处理")
    self.element_fail()

方法二:直接在异常块里执行关闭逻辑

如果element_fail只是单纯调用tearDown,完全可以简化代码,省去额外函数:

except TimeoutException:
    print("元素定位超时,关闭浏览器")
    self.con.tearDown()

3. 结合断言标记测试失败(可选)

如果你想通过断言明确标记测试失败,可以在异常处理后用unittest的self.fail()方法:

except TimeoutException:
    print("元素定位超时,执行自定义处理逻辑")
    self.con.tearDown()
    # 主动标记测试失败并给出提示
    self.fail("登录页面关键元素「nada」未找到,测试终止")
完整修改后的代码示例
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
import set_up

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.con = set_up.Connect()
        self.driver = self.con.setUp()

    def element_fail(self):
        self.con.tearDown()

    def test_login(self):
        try:
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_all_elements_located((By.NAME, "userName"))
            )
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.NAME, "password"))
            )
            # 不存在的元素,会触发TimeoutException
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.NAME, "nada"))
            )
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.NAME, "login"))
            )
        except TimeoutException:
            print("元素定位超时,执行自定义处理")
            self.element_fail()
            self.fail("登录页面关键元素未找到,测试失败")

    def tearDown(self):
        # 兜底逻辑:确保无论是否异常,浏览器都能关闭
        if hasattr(self, 'driver'):
            self.driver.quit()

if __name__ == '__main__':
    unittest.main()
额外提示

建议在测试类的tearDown方法里添加兜底的浏览器关闭逻辑——这样就算有未捕获的异常,也能保证浏览器被正常关闭,不会残留后台进程。

内容的提问来源于stack exchange,提问作者emiliano gramajo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:52