screenshot python_Selenium3+python异常后截图(screenshot)

前言

在执行用例过程中由于是无人值守的,用例运行报错的时候,我们希望能对当前屏幕截图,留下证据。

在写用例的时候,最后一步是断言,可以把截图的动作放在断言这里,那么如何在断言失败后截图呢?

一、截图方法

1.get_screenshot_as_file(self, filename)

--这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。

filename参数是保存文件的路径。

Usage:

driver.get_screenshot_as_file('/Screenshots/foo.png')

2.get_screenshot_as_base64(self)

--这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。

比如,想把截图放到html测试报告里。

Usage:

driver.get_screenshot_as_base64()

3.get_screenshot_as_png(self)

--这个是获取屏幕截图,保存的是二进制数据,很少用到.

Usage:

driver.get_screenshot_as_png()

二、异常后截图

1.为了能抛异常,把定位登录按钮的id换了个错的id。

2.给图片命名时候加个时间戳,避免同一个文件名称被覆盖掉。

3.文件路径,这里直接写的文件名称,就是跟当前的脚本同一个路径。如果图片输出到其它文件路径,需要些文件的绝对路径了。

4.截图的结果,如果没截到图返回False,截图成功会返回True。

三、selenium实例

1.在unittest框架里写用例的时候,我们希望在断言失败的时候,对当前屏幕截图。

2.如果加try...except捕获异常后结果,此时所有的测试用例都是通过的了,会影响测试结果。解决办法其实很简单,再把异常抛出来就行了。

3.参考代码:

#coding:utf-8

from selenium importwebdriverimporttime,unittestfrom selenium.webdriver.support importexpected_conditions as ECclassLogin(unittest.TestCase):defsetUp(self):

url_login= "https://passport.cnblogs.com/user/signin"self.driver=webdriver.Firefox()

self.driver.get(url_login)deftest_01(self):'''前面输入账号密码,让正确运行到assert这一步,断言故意设置为False不成功'''

try:

self.driver.find_element_by_id("input1").send_keys(u"李**")

self.driver.find_element_by_id("input2").send_keys("xxx")#登录id是错的,定位会抛异常

self.driver.find_element_by_id("signin").click()#判断登录成功页面是否有账号:"李**"

time.sleep(3)

locator= ("id", "lnk_current_user")

result= EC.text_to_be_present_in_element(locator,u"李**")(self.driver)

self.assertFalse(result)exceptException as msg:print(u"异常原因%s"%msg)#图片名称可以加个时间戳

nowTime = time.strftime("%Y%m%d.%H.%M.%S")

self.driver.get_screenshot_as_file('%s.jpg' %nowTime)raise

deftearDown(self):

self.driver.quit()if __name__ == "__main__":

unittest.main()

整理的代码:

#-*-coding:utf-8 -*-

importosimportinspectfrom datetime importdatetimefrom functools importwraps"""此模块用于屏幕截图"""

#获取截截图保存的路径

base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

img_base_path= os.path.join(base_path, 'img')#截图

defscreenshot(driver, case_name, img_base_path):

screenshotPath=os.path.join(img_base_path, case_name)

time_now= datetime.now().strftime('%Y%m%d%H%M%S')

screen_shot_name= "CheckPoint_NG.png"screen_img= screenshotPath + '_' + time_now + '_' +screen_shot_name#screen_img = os.path.join(screenshotPath, screenshotName)

driver.get_screenshot_as_file(screen_img)returnscreen_img#得到当前类的实例方法名#也就是获得用例的名称

defget_current_function_name():return inspect.stack()[1][3]#case 断言失败截图装饰器

defscreenshot_about_case(func):#保持传入的case的名称不被装饰器所改变

@wraps(func)#t = func

def get_screenshot_about_case(self, *args, **kwargs):try:

func(self,*args, **kwargs)exceptException as e:#获取case_name的名称

case_name = '{}_{} invoked'.format(self.__class__.__name__, get_current_function_name())#截屏的路径

screenshotPath =os.path.join(img_base_path, case_name)#获得现在的时间戳

time_now = datetime.now().strftime('%Y%m%d%H%M%S')#名字的一部分

screen_shot_name = "CheckPoint_NG.png"

#组装图片需要传入的路径和推片名称

screen_img = screenshotPath + '_' + time_now + '_' +screen_shot_name#截图并保存到相应的名称的路径

self.driver.get_screenshot_as_file(screen_img)raiseereturn get_screenshot_about_case

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值