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
相关产品推荐
相关产品推荐

