在使用 unittest 写用例的时候,想要实现:在用例执行的过程中,出现任何错误或失败,就进行截图……代码如下:

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from parameterized import parameterized
import unittest,time
class BaiduTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(3)
        self.base_url = "https://www.baidu.com"

    #自己写的截图装饰器
    def screenshot_error(func):
        def _screenshot_error(self,*args,**kwargs):
            try:
                func(self,*args,**kwargs)
            except Exception as e:
                self.driver.get_screenshot_as_file("error.png")
                raise e
        return _screenshot_error

    @screenshot_error
    #@parameterized.expand([(u"自动化测试")])
    def test_baidu(self,key="python"):
        u'''baidu搜索测试'''
        driver = self.driver
        driver.get(self.base_url)
        driver.find_element_by_id('kw').send_keys(key,Keys.ENTER)
        time.sleep(1)
        title = driver.title
        self.assertEqual(key,title)  #错误的断言,验证截图功能

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

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

运行通过,截图保存成功……

于是再添加 @parameterized.expand([(u"自动化测试")])装饰器,现在运行就有问题了,用例会运行 2 次,第一次是一个空用例,截下一张空白图片,第二次不会截图……出错信息:

Traceback (most recent call last):
File "/home/bhyuan/selenuim-python/test_baidu.py", line 49, in _screenshot_error
raise e
File "/home/bhyuan/selenuim-python/test_baidu.py", line 45, in _screenshot_error
func(self,*args,**kwargs)
TypeError: 'NoneType' object is not callable

本人初学者,感觉问题应该在此处

def _screenshot_error(self,*args,**kwargs):

不知如何修改?

其实两个装饰器后,装饰器内部运行逻辑,我是十分懵逼啊,希望有共同需求的童鞋一起探讨,期待大神指点~~~

备注:parameterized 是通过 $ pip install parameterized 安装的


↙↙↙阅读原文可查看相关链接,并与作者交流