原生的unittest框架是不支持case失败后自动截图的功能的,网上看了大家的解决办法,大体上分为两种:
1、要么加装饰器
2、也有人封装断言
这里我们看看还有没有其他的更加方便的方法值得大家一起探讨一下:

找不到元素后自动截图

如果使用selenium的话(相比于selenium,我更加喜欢airtest,这个后面的文章会提到airtest的UI自动化设计),我们知道不管是sendkeys、click、doubleclick 等操作还是assert都会去调用find_element 方法,我们完全可以在找不到元素的时候就进行截图呀,这样需要重新封装一下find_element方法即可。如下就是一个解决方案:

def find_element(self, *loc):
"""
重封装的find方法,接受元祖类型的参数,默认等待元素5秒,寻找失败时自动截图
:param loc:元组类型,必须是(By.NAME, 'username')这样的结构
:return:元素对象webelement
"""
try:
webelement = WebDriverWait(self.operate_driver, 5).until(lambda x: x.find_element(*loc))
return webelement
#except (TimeoutException, NoSuchElementException,AttributeError) as e:
except Exception as e:
# 截图路保存径,绝对路径,也可以用相对路径
SCREENSHOTURL = r"C:\Users\Administrator\Desktop\UItest\screenshot\\"
# 时间样式
ISOTIMEFORMAT = '%Y%m%d%H%M%S'
#寻找失败时自动截图至指定目录sreenshot,截图名称为调用方法名(测试用例名)+ 时间戳 + png后缀
self.operate_driver.get_screenshot_as_file(SCREENSHOTURL + sys._getframe(1).f_code.co_name + '_' + time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))+".png")
 

用例执行失败后自动截图

上面所说的当找不到元素的时候会自动截图的方法只能部分的解决的用例失败的截图问题,有时候可能元素能够找到但是case依然会失败。这个时候就需要下面的一种方法:用例执行失败后自动截图。这种方法也更加适合UI自动化设计的原始目的。
Unittest支持setup和teardown,是否可以创建一个主类,主类里面设计好每条case执行前要做什么,每条case执行后要做什么。暂且我们先不管setup,要满足在每条case失败后自动截图的功能,我们可以只在teardown里面下点功夫即可。话不多说直接上代码:

# 主测试类继承自测试框架unittest
class MainCase(unittest.TestCase):
# 声明一个webdriver
#driver = WebChrome()
driver = webdriver
base_url = ReadWritePara('common', 'base_url').get_value()
#在allure报告中初始化环境信息 def setUp(self):
# 测试之前,启动浏览器,打开一个设定好的网址
self.driver = webdriver.Chrome()
#print(self.driver)
self.driver.get(self.base_url)
#最大化窗口,防止下窗口情况下图片不匹配
self.driver.maximize_window() def tearDown(self):
# 当用例执行失败后会自动截图
if len(self._outcome.errors) >= 1:
print(self.driver)
allure.attach(" ", self.driver.get_screenshot_as_png(), type=AttachmentType.PNG)
# 测试完毕的时候关闭浏览器
self.driver.quit() if __name__ == '__main__':
unittest.main()
 

单条测试用例可以继承MainCase即可,这样就可以做到当case执行失败,自动保存截图

上面仅仅个人观点,欢迎大家来探讨

Unittest 支持 case 失败后自动截图功能的另外两种方式的更多相关文章

  1. springboot项目启动成功后执行一段代码的两种方式

    springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...

  2. 【框架】selenium运行失败后自动截图(三)

    思路: 1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法 2.在onTestFailure方法里,调用selenium的TakesScreenShot的g ...

  3. 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式

    一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...

  4. selenium中webdriver跳转新页面后定位置新页面的两种方式

    刚刚在写Python爬虫的时候用到了selenium , 在跳转新页面时发现无法定位新页面 , 查找不到新页面的元素 一番查询后得到了解决方法 , 便记录下来备忘 , 也与大家分享 # 页面跳转代码. ...

  5. Webdriver+Testng实现测试用例失败自动截图功能

    testng执行测试用例的时候,如果用例执行失败会自动截图,方便后续排查问题 1.首先定义一个截图类: package com.rrx.utils; import java.io.File;impor ...

  6. webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载

    作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...

  7. [Android]解决3gwap联网失败:联网请求在设置代理与直连两种方式的切换

    [Android]解决3gwap联网失败:联网请求在设置代理与直连两种方式的切换 问题现象: 碰到一个问题,UI交互表现为:联通号码在3gwap网络环境下资源一直无法下载成功. 查看Log日志,打印出 ...

  8. Nginx配置同一个域名同时支持http与https两种方式访问

    Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server{listen 80;listen 443 ssl;ssl on;server_name 域名;in ...

  9. SpringMVC 控制器默认支持GET和POST两种方式

    在SpringMVC的controller中,@RequestMapping只写路径,不包含RequetMethod.GET和RequetMethod.POST,HttpServletRequest的 ...

随机推荐

  1. LeetCode刷题------------------------------LeetCode使用介绍

    临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...

  2. POJ 1485:Fast Food(dp)&& 面试题

    题目链接 题意 给出 n 个餐厅,m 个停车场,现在要将 n 个餐厅中的 m 个变成停车场,使得每个餐厅到最近的停车场的距离之和最短,输出哪个餐厅变成停车场和它服务哪些餐厅,还有最短距离之和. 思路 ...

  3. BZOJ 2435:[Noi2011]道路修建(树型DP)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2435 题意:中文题意. 思路:很简单的树形DP,sz记录儿子有多少个和cur记录走的哪条弧,然后直接 ...

  4. RT-Thread定时器以及结构体指针的一些思考

    定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...

  5. iOS 矢量图pdf替换2倍3倍图

    一.在开发中矢量图的使用大大提高设计的切图效率! ios 中可以用pdf替换现在的2倍3倍图(1倍图已经忽略) 1.将pdf矢量图拖进工程Assets.xcassets中 2.按照步骤操作 3.矢量图 ...

  6. 数据结构&算法的引言+时间复杂度

    一.什么是计算机科学? 首先明确的一点就是计算机科学不仅仅是对计算机的研究,虽然计算机在科学发展的过程中发挥了重大的作用,但是它只是一个工具,一个没有灵魂的工具而已.所谓的计算机科学实际上是对问题.解 ...

  7. python中的内置函数的思维导图

    https://mubu.com/doc/taq9-TBNix

  8. CTSC&APIO被教做人记

    DAY 0: 早早起来从衡水出发,在去火车站的路上明白了HZOI总是差点误车的真相……上了绿皮火车之后由于没网没流量就开始看政治书应付学考,然而并不是很能看进去,感觉初中学的比高中学的不知道高到哪里去 ...

  9. Bzoj 2318 Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Sol ...

  10. 20131209-数据库导入导出数据-sqlhelper-第十七天

    [1] 导出数据 namespace _05导出数据 { class Program { static void Main(string[] args) { string str = "Da ...