如何捕获 Python Unittest 测试用例失败的屏幕截图

Pra*_*tel 3 python pytest selenium-webdriver python-unittest python-3.6

我使用 Python 3.6.5 和以下库:

  • Appium-Python-客户端==0.26
  • unittest2==1.1.0
  • 硒==3.5.0
  • pytest==3.6.3

现在我需要在测试失败的情况下捕获屏幕截图,所以我故意放了一个错误的陈述 self.driver.find_element_by_css_selector('test')

我正在使用sys.exc_info(). 但是当我使用命令执行以下代码时:py.test untitled.py或者python3 -m unittest untitled.py它没有捕获它。

代码:

import sys, time, unittest2
from selenium import webdriver

class FB360(unittest2.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()

    def test_user_can_login(self):
            self.driver.get('https://www.google.co.in')
            self.driver.find_element_by_css_selector('test')

    def tearDown(self):
        print(sys.exc_info())
        if sys.exc_info()[0]:
            test_method_name = self._testMethodName
            self.driver.save_screenshot(test_method_name + str(time.time()) + '.png')
        self.driver.quit()

if __name__ == '__main__':
    unittest2.main()
Run Code Online (Sandbox Code Playgroud)

开/关:

(无,无,无)

================================================== ==================== 错误:test_user_can_login (untitled.FB360)


回溯(最近一次通话):文件“/Volumes/Harry/Projects/pythonScreenshots/untitled.py”,第 11 行,在 test_user_can_login self.driver.find_element_by_css_selector('test') 文件“/Library/Frameworks/Python.framework/ Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 498, in find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) File "/Library/ Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 832, in find_element 'value': value})['value'] 文件“ /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py”,第 297 行,在执行 self.error_handler 中。check_response(response) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py”,第 194 行,在 check_response 中引发 exception_class(message,屏幕,堆栈跟踪)selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“css选择器”,“选择器”:“测试”}(会话信息:chrome = 67.0.3396.99 ) (驱动信息:chromedriver=2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),platform=Mac OS X 10.13.5 x86_64)common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{"method":"css selector","selector":"test"}(会话信息:chrome=67.0.3396.99)(驱动程序信息:chromedriver =2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),平台=Mac OS X 10.13.5 x86_64)common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{"method":"css selector","selector":"test"}(会话信息:chrome=67.0.3396.99)(驱动程序信息:chromedriver =2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),平台=Mac OS X 10.13.5 x86_64)

我的基础:

  • print(sys.exc_info())打印:(无,无,无)。这意味着即使我收到以下异常,我的测试用例也会通过:

selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法定位元素:{"method":"css selector","selector":"test"}

  • 作为sys.exc_info()) 返回 (None, None, None) 执行不会在if条件下完成

所以我主要关心的是为什么sys.exc_info()) 即使我收到 NoSuchElementException 也会返回 (None, None, None) ?

jav*_*ved 6

我用它来截取失败测试的截图

@pytest.fixture()
def browser(request):
    options = Options()
    options.add_argument("--headless")  # Runs Chrome in headless mode.
    _chrome = webdriver.Chrome(options=options)
    failed_before = request.session.testsfailed
    yield _chrome
    if request.session.testsfailed != failed_before:
        test_name = request.node.name
        take_screenshot(_chrome, test_name)
    _chrome.close()


def take_screenshot(browser, test_name):
    screenshots_dir = "path_to/functional_tests/failure_screenshots"
    screenshot_file_path = "{}/{}.png".format(screenshots_dir, test_name)
    browser.save_screenshot(
        screenshot_file_path
    )
Run Code Online (Sandbox Code Playgroud)