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)

执行结果

 

posted @ 2022-01-08 20:53  Flutter  阅读(472)  评论(0编辑  收藏  举报