Unittest 支持 case 失败后自动截图功能的另外两种方式
原生的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 失败后自动截图功能的另外两种方式的更多相关文章
- springboot项目启动成功后执行一段代码的两种方式
springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...
- 【框架】selenium运行失败后自动截图(三)
思路: 1.写一个类继承TestListenerAdapter,覆写onTestFailure()方法 2.在onTestFailure方法里,调用selenium的TakesScreenShot的g ...
- 在javaScript中把非数值类型的数据自动转换为数值类型的两种方式
一.使用Number()函数. 二.使用parseInt()/parseFloat()函数. 详情: 一.使用Number()函数将非数值类型的数据自动的转化为数组类型 Number()函数可以将任何 ...
- selenium中webdriver跳转新页面后定位置新页面的两种方式
刚刚在写Python爬虫的时候用到了selenium , 在跳转新页面时发现无法定位新页面 , 查找不到新页面的元素 一番查询后得到了解决方法 , 便记录下来备忘 , 也与大家分享 # 页面跳转代码. ...
- Webdriver+Testng实现测试用例失败自动截图功能
testng执行测试用例的时候,如果用例执行失败会自动截图,方便后续排查问题 1.首先定义一个截图类: package com.rrx.utils; import java.io.File;impor ...
- webpack--运行npm run dev自动打开浏览器运行首页的两种方式以及热加载
作为开发人员,我们在修改了代码之后,在vscode终端运行npm run dev指令后,希望它可以自动打开浏览器方便我们调试,有两种方式可以实现: 自动打开浏览器的两种方式: 方式一: 1.webpa ...
- [Android]解决3gwap联网失败:联网请求在设置代理与直连两种方式的切换
[Android]解决3gwap联网失败:联网请求在设置代理与直连两种方式的切换 问题现象: 碰到一个问题,UI交互表现为:联通号码在3gwap网络环境下资源一直无法下载成功. 查看Log日志,打印出 ...
- Nginx配置同一个域名同时支持http与https两种方式访问
Nginx配置同一个域名http与https两种方式都可访问,证书是阿里云上免费申请的 server{listen 80;listen 443 ssl;ssl on;server_name 域名;in ...
- SpringMVC 控制器默认支持GET和POST两种方式
在SpringMVC的controller中,@RequestMapping只写路径,不包含RequetMethod.GET和RequetMethod.POST,HttpServletRequest的 ...
随机推荐
- POI 设置Excel单元格背景色(setFillForegroundColor)
背景介绍:使用Java开发信息系统项目,项目中往往会涉及到报表管理部分,而Excel表格首当其冲称为最合适的选择,但是对单元格操作时对于设置单元格的背景颜色却很少提及,本文旨在方便单元格背景颜色设计. ...
- msf出现Database not connected等问题【已解决】
kali启动msf后,出现Module database cache not built yet, using slow search,或是Database not connected,或是 ...
- 获取文件版本(IE)
GetFileInfoCUIAction::GetFileVersion2GetSystemDirectory WCHAR szConfigFile[MAX_PATH + 1]; ::G ...
- D:苏卿念发红包
首先,题目中已经说得很明确了(按照常理也是). 当有mmm个包,你第kkk个抢.k>mk>mk>m的话.显然,平时会显示:来晚了一步,红包已经被领完了\text{来晚了一步,红包已经 ...
- jsp页面中将CST时间格式化为年月日
引入: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> 格式化: ...
- 关于Calendar的一些用法总结
import java.util.Calendar; import java.security.KeyStore.TrustedCertificateEntry; import java.text.D ...
- xutils3 上传文件操作——个人小计
上传文件注意: 使用KeyValue对象进行添加文件操作 int uid = 2; //普通字段的存储 requestParams.addBodyParameter("uid", ...
- [leetcode] 290. Word Pattern (easy)
原题 思路: 建立两个哈希表,分别保存: 1 模式 :单词 2 单词 :是否出现过 水题 /** * @param {string} pattern * @param {string} str * @ ...
- Java提供的几种线程池
线程池,顾名思义,放线程的池子嘛,这个池子可以存放多少线程取决于你自己采用什么样的线程池,你的硬件资源,以及并发线程的数量.JDK提供了下面的四种线程池: 固定线程数的线程池 最简单的 在Java中创 ...
- 在Ubuntu中安装Docker和docker的使用
1.在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ ap ...