zoukankan      html  css  js  c++  java
  • Selenium2+python自动化67-用例失败自动截图【转载】

    前言:

    装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数

    上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装饰器改良了下,可以实现用例执行失败自动截图。

     
    一、不带变量的装饰器

    1.参考资料:http://www.artima.com/weblogs/viewpost.jsp?thread=240845,这里这篇讲的很好,可以看下原文

    2.这个是不带变量的装饰器__init__里是初始化参数,__call__里面是原函数参数

    Decorators without Arguments

    If we create a decorator without arguments, the function to be decorated is passed to the constructor, and the __call__() method is called whenever the decorated function is invoked:

    class decoratorWithoutArguments(object):

        def __init__(self, f):
            """
            If there are no decorator arguments, the function
            to be decorated is passed to the constructor.
            """
            print "Inside __init__()"
            self.f = f

        def __call__(self, *args):
            """
            The __call__ method is not called until the
            decorated function is called.
            """
            print "Inside __call__()"
            self.f(*args)
            print "After self.f(*args)"

    @decoratorWithoutArguments
    def sayHello(a1, a2, a3, a4):
        print 'sayHello arguments:', a1, a2, a3, a4

     

    二、带变量的装饰器

    1.这个是带变量的参数,参数写到__init__里

    Decorators with Arguments

    Now let's modify the above example to see what happens when we add arguments to the decorator:

    class decoratorWithArguments(object):

        def __init__(self, arg1, arg2, arg3):
            """
            If there are decorator arguments, the function
            to be decorated is not passed to the constructor!
            """
            print "Inside __init__()"
            self.arg1 = arg1
            self.arg2 = arg2
            self.arg3 = arg3

        def __call__(self, f):
            """
            If there are decorator arguments, __call__() is only called
            once, as part of the decoration process! You can only give
            it a single argument, which is the function object.
            """
            print "Inside __call__()"
            def wrapped_f(*args):
                print "Inside wrapped_f()"
                print "Decorator arguments:", self.arg1, self.arg2, self.arg3
                f(*args)
                print "After f(*args)"
            return wrapped_f

    @decoratorWithArguments("hello", "world", 42)
    def sayHello(a1, a2, a3, a4):
        print 'sayHello arguments:', a1, a2, a3, a4

     

    三、截图装饰器

    1.有了上面的参考文档,依着葫芦画瓢就行,最大的麻烦就是driver参数处理,这里放到__init__里就可以了


    四、参考案例

    # coding:utf-8
    from selenium import webdriver

    class Screen(object):
        u'''这个应该截图功能的装饰器'''
        def __init__(self, driver):
            self.driver = driver

        def __call__(self, f):
            def inner(*args):
                try:
                    return f(*args)
                except:
                    import time
                    nowTime = time.strftime("%Y_%m_%d_%H_%M_%S")
                    self.driver.get_screenshot_as_file('%s.jpg' % nowTime)
                    raise
            return inner


    # 以下是装饰器与unittest结合的案例
    import unittest
    class Test(unittest.TestCase):

        driver = webdriver.Firefox()  # 全局参数driver

        def setUp(self):
            self.driver.get("https://www.baidu.com")

        @Screen(driver)
        def test01(self):
            u'''这个是失败的案例'''
            self.driver.find_element_by_id("11kw").send_keys("python")
            self.driver.find_element_by_id("su").click()

        @Screen(driver)
        def test_02(self):
            u'''这个是通过的案例'''
            self.driver.find_element_by_id("kw").send_keys("yoyo")
            self.driver.find_element_by_id("su").click()

        def tearDown(self):
            self.driver.quit()

    if __name__ == "__main__":
        unittest.main()

  • 相关阅读:
    jQuery:自学笔记(1)——基础入门
    Android开发——Accessibility机制实现模拟点击(微信自动抢红包实现)
    Android开发——常用ADB命令的使用
    虚拟现实开发一些建议
    Android开发——Activity生命周期
    JVM——内存管理和垃圾回收
    2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了
    2016年工作中遇到的问题41-50:Dubbo注册中心奇葩问题,wifi热点坑了
    Spring核心技术(十)——JSR-330标准注解
    Spring核心技术(九)——Spring管理的组件和Classpath扫描
  • 原文地址:https://www.cnblogs.com/caoj/p/7815751.html
Copyright © 2011-2022 走看看