在使用web自动化测试中,用例失败则自动截图的网上也有,但实际能落地的却没看到,现总结在在实际应用中失败截图的几种方法:

一、使用unittest框架截图方法:

  1、在tearDown中写入截图的功能,如下:

import sys
class SeleniumTest(unittest2.TestCase):
... def tearDown(self):
if sys.exc_info()[0]:
test_method_name = self._testMethodName
self.driver.save_screenshot("Screenshots/%s.png" % test_method_name)
super(SeleniumTest, self).tearDown()

注意,self._testMethodName是unittest特有的,在其它框架中不使用

在测试中,如果用例失败,就会自动以对应的测试函数名为文件名截图存储

2、自定义函数,重写unittest中的run方法:

class ScreenShotUtil:
"Screenshot Utility Class" @staticmethod
def take_screenshot(webdriver, file_name="error.png"):
"""
@param webdriver: WebDriver.
@type webdriver: WebDriver
@param file_name: Name to label this screenshot.
@type file_name: str
"""
if isinstance(webdriver, remote.webdriver.WebDriver):
# Get Screenshot over the wire as base64
base64_data = webdriver.get_screenshot_as_base64()
screenshot_data = base64.decodestring(base64_data)
screenshot_file = open(filename, "w")
screenshot_file.write(screenshot_data)
screenshot_file.close()
else:
webdriver.save_screenshot(filename)

在引中unittest时,重写run方法:

...
class ScreenCaptureTestCase(unittest.TestCase):
...
# Defining an init method so we can pass it a webdriver.
def __init__(self, methodName='runTest', webdriver=None, screenshot_util=None):
super(WDBaseTest, self).__init__(methodName) if webdriver_provider == None:
self._webdriver = WebDriverSingleton.get_instance()
else:
self._webdriver = webdriver if screenshot_util == None:
self._screenshot_util = WebScreenShotUtil
else:
self._screenshot_util = screenshot_util
...
def run(self, result=None):
"""
这里重写run方法
"""
orig_result = result
if result is None:
result = self.defaultTestResult()
startTestRun = getattr(result, 'startTestRun', None)
if startTestRun is not None:
startTestRun()
... more pyunit code ...
except self.failureException:
# Insert our Take Screenshot on test failure code.
fname = str(self).replace("(", "").replace(")", "").replace(" ", "_")
fmt='%y-%m-%d_%H.%M.%S_.PNG'
filename = datetime.datetime.now().strftime(fmt)
self._screenshot_util.take_screenshot(self._webdriver, filename)
result.addFailure(self, sys.exc_info())
... more pyunit code...
except:
# Do the same thing again for errors.
fname = str(self).replace("(", "").replace(")", "").replace(" ", "_")
fmt='%y-%m-%d_%H.%M.%S_.PNG'
filename = datetime.datetime.now().strftime(fmt)
self._screenshot_util.take_screenshot(self._webdriver, filename)
result.addError(self, sys.exc_info()) ...

完成后,测试时,失败则会已时间来截图,当然你也可以将filename按你喜好定义

二、nose框架失败截图

nose框架是unittest的优化,在实际使用中可以继承unittest.TestCase的方法后继续使用中的方法1,如果没导入unittest.TestCase时,也可以使用方法1,但要作小改动,如下:

1、tearDown写截图

class SeleniumTest(unittest2.TestCase):
... def tearDown(self):
if sys.exc_info()[0]:
test_method_name = test_names = [n for n in dir(self) if n.startswith('test_')][0] #注意了,这里与unittest的不一样
self.driver.save_screenshot("Screenshots/%s.png" % test_method_name)
super(SeleniumTest, self).tearDown()

2、修改nose源码,未完待续

python web自动化测试中失败截图方法汇总的更多相关文章

  1. 【Python】自动化测试框架-共通方法汇总

    1.滚动滚动条(有的时候页面元素element取得对但是并没有回显正确的数据,可能是因为页面第一次加载很慢,所以页面可能做了滚动到哪里就加载到哪里的效果,此刻我们就需要用到滚动条自动滚动这段代码让页面 ...

  2. Python+selenium自动化测试中Windows窗口跳转方法

    Python+selenium自动化测试中Windows窗口跳转方法 #第一种方法 #获得当前窗口 nowhandle=driver.current_window_handle #打开弹窗 drive ...

  3. Python 爬虫的代理 IP 设置方法汇总

    本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...

  4. Python Web自动化测试入门与实战,从入门到入行

    Python Web自动化测试入门与实战 购买地址 · 京东:https://item.jd.com/69239480564.html   天猫:https://detail.tmall.com/it ...

  5. Web Api中实现Http方法(Put,Post,Delete)

    在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...

  6. Python Web开发中的WSGI协议简介

    在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...

  7. JavaScript在web自动化测试中的作用

    前言 JS的全称JavaScript,是一种运行在浏览器中的解释型脚本语言,通常用来实现web前端页面的基本功能,对于前端开发人员是不得不掌握的一门基本技能,但是对于做web自动化测试的人员来说,如果 ...

  8. web自动化测试中绕开验证码登陆的方式

    web自动化测试中登陆需验证码是很大的一个困扰.现推荐一种简单的避开验证码登陆的方式,先代码进入登录页,人工输入验证码登录后浏览器自动保存cookie,再在新的标签中登录. 具体代码如下: publi ...

  9. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

随机推荐

  1. .net里Release的pdb文件有什么用 是否可以删除

    程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接. 在使用 /debug 生成时,会创建一个 PDB 文件. 可以使用 /debug:full 或 / ...

  2. iOS开发-获取设备型号信息

    开发中有的时候查看设计统计数据,或者通过日志查看错误信息,这个时候我们就需要获取获取设备信息,看下关于设备有几种方法: NSLog(@"%@",[[UIDevice current ...

  3. dyld`__abort_with_payload:

    dyld`__abort_with_payload: 0x1030422f0 <+0>:  mov    x16, #0x209 0x1030422f4 <+4>:  svc  ...

  4. VirtualBox中出现UUID have already exists 解决方法

    虚拟机更换VDI文件,启动时会出现 "UUID already exists"的错误,这是因为删除虚拟机时候没有选择"删除所有",只是选择移除造成的. 方法一: ...

  5. Effective Java 第三版——56. 为所有已公开的API元素编写文档注释

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  6. 将csv的数据导入mysql

    手头有一份8MB的CSV文件需要分析,对于程序员来说,还有比在数据库里分析更愉快的事情吗? 所以让我们把CSV导入MYSQL吧. 一.首先按照文件列数创建相应的SQL表 例如: DROP TABLE ...

  7. [转]Greenplum 执行计划之广播与重分布

    关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...

  8. Socket网络编程--聊天程序(9)

    这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...

  9. Socket网络编程--简单Web服务器(5)

    这一小节我们将实现服务器对get和post的请求进行对cgi程序的调用.对于web服务器以前的章节已经实现了对get和post请求的调用接口,接下来给出对应接口的实现. int WebServer:: ...

  10. Linux之sort

    sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按AS ...