测试用例在执行过程中是无人看守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据。而在写测试用例的时候,最后一步是断言,可以把截图的动作放在断言之后,那么如何在断言失败后执行截图操作呢?
一、截图方法
# 获取当前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()