Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 605|回复: 0

Selenium3+python异常后截图(screenshot)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-29 14:24:36 | 显示全部楼层 |阅读模式

    前言

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

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

     

    一、截图方法

    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 import webdriver import time,unittest from selenium.webdriver.support import expected_conditions as EC class Login(unittest.TestCase): def setUp(self): url_login = "https://passport.cnblogs.com/user/signin" self.driver = webdriver.Firefox() self.driver.get(url_login) def test_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) except Exception 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
    
        def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()

     整理的代码:

    # -*-coding:utf-8 -*-
    import os import inspect from datetime import datetime from functools import wraps """ 此模块用于屏幕截图 """
    # 获取截截图保存的路径
    base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) img_base_path = os.path.join(base_path, 'img') # 截图
    def screenshot(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) return screen_img # 得到当前类的实例方法名 # 也就是获得用例的名称
    def get_current_function_name(): return inspect.stack()[1][3] # case 断言失败截图装饰器
    def screenshot_about_case(func): # 保持传入的case的名称不被装饰器所改变
     @wraps(func) # t = func
        def get_screenshot_about_case(self, *args, **kwargs): try: func(self, *args, **kwargs) except Exception 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) raise e return get_screenshot_about_case

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-3 14:32 , Processed in 0.055556 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表