繁体   English   中英

如果我的测试失败,如何捕获屏幕截图?

[英]How do I capture a screenshot if my nosetests fail?

我用nosetests运行selenium webdriver测试。 我想在鼻子测试失败时捕获截图。 如何通过使用webdriver,python或nosetests功能以最有效的方式完成?

我的解决方案

import sys, unittest
from datetime import datetime

class TestCase(unittest.TestCase):

    def setUp(self):
        some_code

    def test_case(self):
        blah-blah-blah

    def tearDown(self):
        if sys.exc_info()[0]:  # Returns the info of exception being handled 
            fail_url = self.driver.current_url
            print fail_url
            now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S-%f')
            self.driver.get_screenshot_as_file('/path/to/file/%s.png' % now) # my tests work in parallel, so I need uniqe file names
            fail_screenshot_url = 'http://debugtool/screenshots/%s.png' % now
            print fail_screenshot_url
        self.driver.quit()

首先,webdriver有以下命令:

driver.get_screenshot_as_file(screenshot_file_path)

我不是鼻子方面的专家(实际上这是我第一次看到它),但是我使用了py.test框架(它类似于nose恕我直言)。

很可能你必须为nose创建“插件” ,你必须实现钩子addFailure(test, err) ,这是“当测试失败时调用”。

在这个addFailure(test, err)您可以从Test对象获取测试名称并生成文件的路径。

之后调用driver.get_screenshot_as_file(screenshot_file_path)

py.test我使用def pytest_runtest_makereport(item, call):实现来创建我的插件def pytest_runtest_makereport(item, call): hook。 在内部我分析call.excinfo并在必要时创建屏幕截图。

在Python中,您可以使用以下代码:

driver.save_screenshot('/file/screenshot.png')

也许您已经以不同的方式设置了测试,但根据我的经验,您需要手动构建此类功能并在失败时重复它。 如果执行Selenium测试,有机会,像我一样,你用了很多的东西 find_element_by_。 我编写了以下函数来允许我处理这类事情:

def findelement(self, selector, name, keys='', click=False):

    if keys:
        try:
            self.driver.find_element_by_css_selector(selector).send_keys(keys)
        except NoSuchElementException:
            self.fail("Tried to send %s into element %s but did not find the element." % (keys, name))
    elif click:
        try:
            self.driver.find_element_by_css_selector(selector).click()
        except NoSuchElementException:
            self.fail("Tried to click element %s but did not find it." % name)
    else:
        try:
            self.driver.find_element_by_css_selector(selector)
        except NoSuchElementException:
            self.fail("Expected to find element %s but did not find it." % name)

在您的情况下,屏幕截图代码(self.driver.get_screenshot_as_file(screenshot_file_path))将在self.fail之前。

使用此代码,每次要与元素交互时,都会调用self.findelement('selector','element name')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM