封装了三个类来实现这个功能:

1.DataUtil.py 用于获取当前的日期以及时间,用于生成保存截图文件的目录名,代码如下:

#encoding=utf-8
import time
from datetime import datetime '''
本文件主要用于获取当前的日期以及时间,
用于生成保存截图文件目录名
''' def currentDate():
date = time.localtime()
# 构造今天的日期字符串
today = str(date.tm_year) + "-" + str(date.tm_mon) + "-" + str(date.tm_mday)
return today def currentTime():
timeStr = datetime.now()
# 构造当前时间字符串
now = timeStr.strftime('%H-%M-%S')
return now if __name__ == "__main__":
print currentDate()
print currentTime()

FileUtil.py 主要用于创建目录,用于存放异常截图,代码如下:

#encoding=utf-8
from DateUtil import currentDate, currentTime
import os '''
本文件主要用于创建目录,用于存放异常截图,
创建目录的方法仅供大家参考,将来用于根据测试
需要创建测试人员需要的目录或文件等
''' def createDir():
# 获得当前文件所在目录绝对路径
currentPath = os.path.dirname(os.path.abspath(__file__))
# 获取今天的日期字符串
today = currentDate()
# 构造以今天日期命名的目录的绝对路径
dateDir = os.path.join(currentPath, today)
print dateDir
if not os.path.exists(dateDir):
# 如果已今天日期命名的目录不存在则创建
os.mkdir(dateDir)
# 获得当前的时间字符串
now = currentTime()
# 构造以当前时间命名的目录的绝对路径
timeDir = os.path.join(dateDir, now)
print timeDir
if not os.path.exists(timeDir):
# 如果已当前时间命名的目录不存在则创建
os.mkdir(timeDir)
return timeDir if __name__=='__main__':
createDir()

3. Failure_Capture.py 截屏方法封装,代码如下:

#encoding=utf-8
from selenium import webdriver
import unittest, time, os
from FileUtil import createDir
import traceback # 创建存放异常截图的目录,并得到本次实例中存放图片目录的绝对路径,
# 并且作为全局变量,以供本次所有测试用例调用
picDir = createDir() def takeScreenshot(driver, savePath, picName):
# 封装截屏方法
# 构造屏幕截图路径及图片名
# 因为Windows默认编码是GBK,而传入的图片名为utf8编码,
# 所以这里需要进行转码,以便让图片名中的中文字符能正常显示
picPath = os.path.join(savePath, str(picName).decode("utf-8").encode("gbk")\
+ ".png")
try:
# 调用WebDriver提供的get_screenshot_as_file()方法,
# 将截取的屏幕图片保存为本地文件
driver.get_screenshot_as_file(picPath)
except Exception, e:
# 打印异常堆栈信息
print traceback.print_exc() class TestFailCaptureScreen(unittest.TestCase): def setUp(self):
# 启动Firefox浏览器
self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer") def testSoGouSearch(self):
url = "http://www.sogou.com"
# 访问搜狗首页
self.driver.get(url)
try:
self.driver.find_element_by_id("query").\
send_keys(u"光荣之路自动化测试")
self.driver.find_element_by_id("stb").click()
time.sleep(3)
# 断言页面的代码中是否存在“事在人为”这4个关键字,
# 因为页面中没有这4个字,所以会触发except语句的执行,并触发截图操作
self.assertTrue(u"事在人为" in self.driver.page_source, \
"“事在人为”关键字串在页面源代码中未找到")
except AssertionError, e:
# 调用封装好的截图方法,进行截图并保存在本地磁盘
takeScreenshot(self.driver, picDir, e)
except Exception, e:
print traceback.print_exc()
takeScreenshot(self.driver, picDir, e) def tearDown(self):
# 退出IE浏览器
self.driver.quit() if __name__ == '__main__':
unittest.main()

webdriver高级应用- 测试过程中发生异常或断言失败时进行屏幕截图的更多相关文章

  1. CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行

    CASE:DB shutdown/open 过程中发生异常导致JOB不能自动执行 现象: 一个DB中的所有JOB在3月25日之后就不再自动运行,查询DBA_JOBS,发现LAST_DATE定格在3月2 ...

  2. 打开CAD时出现“acvmtools.arx ARX命令中发生异常

    打开CAD时出现“acvmtools.arx ARX命令中发生异常     解决办法1: 试试进入CAD安装的目录,删掉它acvmtools.arx,重新打开cad.(注:acvmtools.arx一 ...

  3. BackgroundWorker的DoWork方法中发生异常无法传递到RunWorkedCompleted方法

    在使用C#的BackgroundWorker时需要在UI界面上显示DoWork中发生的异常,但怎么调试都无法跳转到界面上,异常也不会传递到RunWorkerCompleted方法中(e.Error为空 ...

  4. webdriver高级应用- 浏览器中新开标签页(Tab)

    #encoding=utf-8 import unittest from selenium import webdriver import time import win32api, win32con ...

  5. eclipse运行tomcat中发生异常重启后tomcat端口被占用

    在任务管理器关闭javaw进程即可,一般此时会有两个以上javaw进程,关闭其中占用内存较少的那个 可用netstat -ano命令查看端口占用情况

  6. .Java中的异常、断言、日志【草稿下,Log4j专题】

    (本章主要讲解Java里面比较核心的一块内容--异常处理,Java异常处理机制,一致都是比较复杂的一块,而很多时候如果写程序的时候能够适当地注意对应的一些异常处理情况,那么就会在开发过程节省一大部分时 ...

  7. java中的异常机制(编译时异常)

    / * 1 异常机制的原理 * 异常是什么:就是错误的另外一种说法; * 在java中,有一个专门模拟所有异常的类,所有的异常都必须继承这个类:Throwable; * 本质是:当程序出错以后,jvm ...

  8. 23. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题1

    这个是angular1.6默认给hash路由上添加了!(感叹号),导致出错,修改方法如下(添加配置,去掉默认前缀感叹号):   angular.module('routingDemoApp',['ng ...

  9. 22. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题

    转自:https://blog.csdn.net/duansale/article/details/77455355 <a href="#/index">index&l ...

随机推荐

  1. Android RecyclerView使用GridLayoutManager导致间隙变大的问题

    我用recyclerView的时候设置LayoutManager为Grid,添加decoration为Grid,作为二级列表时,多次点击一级列表来跳转的时候,两张图之间的间隙在逐渐变大,后来发现是因为 ...

  2. Java中的多线程详解

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  3. java面试题(杨晓峰)---第八讲谈谈Vector,ArrayList,LinkedList有何区别?

    Vector,ArrayList,LinkedList均为线性的数据结构,但是从现实方式与应用场景中又存在差别. 1 底层实现方式 ArrayList内部数组来实现,LinkedList内部采用双向链 ...

  4. pycharm创建工程的两种形式:virtualenv环境和系统默认编译器

    转自:http://swiftlet.net/archives/3151 pycharm创建工程的时候可以选择编译器,如下图所示: 上图表示创建工程有两种方式:第一种是利用:virtualenv,第二 ...

  5. Leetcode重点 250题-前400 题

    删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于简单题目(例:100题:Same Tree) 删除题意不同,代码基本相同题目(例:136 & ...

  6. 01_2_模拟spring装载bean

    01_2_模拟spring装载bean 1. xml配置文件内容 beans.xml <beans> <bean id="u" class="com.w ...

  7. TypeError: Cannot read property 'tap' of undefined

    E:\vue-project\vue-element-admin-master>npm run build:prod vue-element-admin@3.8.1 build:prod E:\ ...

  8. 2018 noip 提高组初赛参考答案

    这里有pdf文件:戳这儿

  9. k8s Pod的自动水平伸缩(HPA)

    我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...

  10. 使用powershell批量更新git仓库

    Get-ChildItem D:\GitHub\NetCore | ForEach-Object -Process{ cd $_.name; git pull; cd ../ }