微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 在异常时执行屏幕截图

嘿,有一种方法可以捕获异常时的截图,任何异常.我的’失败’解决方案放在BaseTestCase,unittest.TestCase子类中:

class BaseTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""some code"""

@property 
def failureException(self):
    class MyFailureException(Exception):
        def __init__(self_, *args, **kwargs):
            screenshot_dir = '../error_log'
            self.driver.save_screenshot('{0}/{1}.jpeg'.format(screenshot_dir, self.id()))
            return super().__init__(*args, **kwargs)

    MyFailureException.__name__ = Exception.__name__
    return MyFailureException

最初它是AssertionError而不是Exception但它只会捕获断言错误而我对其他类型的错误更感兴趣

解决方法:

要在发生错误或故障时截取屏幕截图,请检查tearDown方法中当前是否正在处理异常:

import unittest, sys, exceptions
from selenium import webdriver


class TestCaseBase(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def tearDown(self):
        type, value, traceback = sys.exc_info()
        if type is exceptions.AssertionError :
            self.driver.save_screenshot(r'screenshot-failure.png')
        elif type is exceptions.Exception :
            self.driver.save_screenshot(r'screenshot-error.png')

        self.driver.quit()

class MyTestCase(TestCaseBase):

    def test_should_take_screenshot_on_failure(self):
        self.driver.get("https://stackoverflow.com/")
        self.assertTrue(False)

    def test_should_take_screenshot_on_error(self):
        self.driver.get("https://stackoverflow.com/")
        raise Exception("my exception")


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

您还可以覆盖方法TestResult.addError和TestResult.addFailure:

import unittest
from selenium import webdriver


class TestCaseBase(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

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

    def run(self, result=None):
        super(TestCaseBase, self).run(TestResultEx(result, self))


class MyTestCase(TestCaseBase):

    def test_should_take_screenshot_on_failure(self):
        self.driver.get("https://stackoverflow.com/")
        self.assertTrue(False)

    def test_should_take_screenshot_on_error(self):
        self.driver.get("https://stackoverflow.com/")
        raise Exception("my exception")


class TestResultEx(object):

    def __init__(self, result, testcase):
        self.result = result
        self.testcase = testcase

    def __getattr__(self, name):
        return object.__getattribute__(self.result, name)

    def addError(self, test, err):
        self.result.addError(test, err)
        self.testcase.driver.save_screenshot(r'screenshot-error.png')

    def addFailure(self, test, err):
        self.result.addFailure(test, err)
        self.testcase.driver.save_screenshot(r'screenshot-failure.png')


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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐