selenium+unittest断言失败后截图
unittest测试框架下断言失败后是不会继续执行后面的脚本语句,所以断言失败后再进行截图操作是无法实现的
目前实现断言失败后再截图的功能有以下两种思路:
-通过异常处理的方式实现
-通过装饰器的方式实现
基于封装特性及减少代码冗余度和工作量,本文主要介绍第二种方法
首先定义一个带截图功能的装饰器
# 定义一个装饰器 def addpic(func): def wrapper(self, *args, **kwargs): try: func(self, *args, **kwargs) except AssertionError as e: import os, time screenshot_path = os.getcwd() + r'\screenshot' # 设置截图文件目录 if not os.path.exists(screenshot_path): os.makedirs(screenshot_path) tm = time.strftime("%Y-%m-%d %H,%M,%S", time.localtime(time.time())) # 获取截图,设置截图文件名 self.driver.get_screenshot_as_file(screenshot_path + '\\{}_{}.png'.format('assert', tm)) raise e return wrapper
采用unittest框架编写测试脚本,调用装饰器并执行测试用例
import unittest from selenium import webdriver class AssertScreenshots(unittest.TestCase): def setUp(self) -> None: self.driver = webdriver.Chrome() self.url = 'https://www.baidu.com/' @addpic # 调用装饰器 def test_baidu(self): self.driver.get(self.url) self.driver.find_element('id', 'kw').send_keys('web自动化测试') self.driver.find_element('id', 'su').click() self.assertEqual(1, 2) # 断言失败后截图 def tearDown(self) -> None: self.driver.quit() if __name__ == '__main__': test = unittest.defaultTestLoader.loadTestsFromTestCase(AssertScreenshots) suite = unittest.TestSuite(test) unittest.TextTestRunner().run(suite)
执行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构