34-发生异常后进行截图(screenshot)

        测试用例在执行过程中是无人看守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据。而在写测试用例的时候,最后一步是断言,可以把截图的动作放在断言之后,那么如何在断言失败后执行截图操作呢?

一、截图方法

# 获取当前Window的截图,出现IOError时候返回False,截图成功返回True
# filename参数是保存文件的路径。
# Usage: driver.get_screenshot_as_file('/Screenshots/foo.png')
get_screenshot_as_file(self, filename)

# 获取屏幕截图,保存的是base64的编码格式,在html测试报告中输出截图时会用到
# Usage: driver.get_screenshot_as_base64()
get_screenshot_as_base64(self)

# 获取屏幕截图,保存的是二进制数据,很少用到
# Usage: driver.get_screenshot_as_png()
get_screenshot_as_png(self)

二、使用 try...except 捕获异常后对当前屏幕截图

1)给截图命名时需要加上时间戳,避免同一个文件名称被覆盖掉。

2)如果要获取截图,需要填写截图文件的保存路径。

3)截图的结果,如果没截到图会返回False,截图成功会返回True。

import unittest
from selenium import webdriver
import os
import time

class Demo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com")

    def tearDown(self):
        self.driver.quit()

    def test_01(self):
        try:
            self.assertEqual(1, 2)
        except Exception as e:
            # 1.给截图目录名添加上年月日
            day = time.strftime("%Y%m%d", time.localtime(time.time()))
            screenshot_path = os.getcwd() + r'\reports\screenshot_{}'.format(day)
            if not os.path.exists(screenshot_path):
                os.makedirs(screenshot_path)
            # 2.给截图文件名添加上时分秒
            tm = time.strftime("%H%M%S", time.localtime(time.time()))
            self.driver.get_screenshot_as_file(screenshot_path + '\\{}_{}.png'.format('screen_shot', tm))
            # 3.将异常继续抛出给unittest,必须要写
            #   因为unittest要统计测试结果,这里不抛出的话,unittest会认为测试通过,会造成数据统计不准确。
            #   而这里我们只想做截图操作,不想改变测试的结果,因此要抛出。
            raise e

if __name__ == '__main__':
    unittest.main()

三、通过装饰器的方式实现断言失败后再截图的功能

        使用 try...except 捕获异常后对当前屏幕截图,这种方式不太实用。如果对测试用例中的每个断言添加上述 try...except 结构来实现屏幕截图,会造成代码量重复冗余。

        因此可以考虑采用装饰器方式实现断言失败后截图功能。

import unittest
from selenium import webdriver
import os
import time

class Demo(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://www.baidu.com")

    def tearDown(self):
        self.driver.quit()

    # 通过装饰器的方式实现断言失败后再截图的功能
    def addpic(func):
        def wrapper(self, *args, **kwargs):
            try:
                func(self, *args, **kwargs)
            except Exception as e:
                # 1.给截图目录名添加上年月日
                day = time.strftime("%Y%m%d", time.localtime(time.time()))
                screenshot_path = os.getcwd() + r'\reports\screenshot_{}'.format(day)
                if not os.path.exists(screenshot_path):
                    os.makedirs(screenshot_path)
                # 2.给截图文件名添加上时分秒
                tm = time.strftime("%H%M%S", time.localtime(time.time()))
                self.driver.get_screenshot_as_file(screenshot_path + '\\{}_{}.png'.format('screen_shot', tm))
                # 3.将异常继续抛出给unittest,必须要写
                #   因为unittest要统计测试结果,这里不抛出的话,unittest会认为测试通过,会造成数据统计不准确。
                #   而这里我们只想做截图操作,不想改变测试的结果,因此要抛出。
                raise e
        return wrapper

    @addpic
    def test_01(self):
        self.assertEqual(1, 2)

if __name__ == '__main__':
    unittest.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值