6

我正在使用nosetests 运行selenium webdriver 测试。每当鼻子测试失败时,我想捕获屏幕截图。我怎样才能以最有效的方式做到这一点,无论是使用 webdriver、python 还是 nosetests 功能?

4

4 回答 4

8

My solution

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()
于 2013-02-27T16:58:56.477 回答
6

首先,webdriver 有命令:

driver.get_screenshot_as_file(screenshot_file_path)

我不是鼻子专家(实际上这是我第一次研究它),但是我使用py.test框架(类似,但优于nose恕我直言)。

很可能您必须为鼻子创建“插件”,您必须在其中实现addFailure(test, err)“测试失败时调用”的钩子。

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

在那次通话之后driver.get_screenshot_as_file(screenshot_file_path)

py.test我创建带有def pytest_runtest_makereport(item, call):钩子实现的插件时。call.excinfo如有必要,我在里面分析并创建屏幕截图。

于 2013-02-21T15:09:58.950 回答
0

也许您设置了不同的测试,但根据我的经验,您需要手动构建这种类型的功能并在失败时重复它。如果您正在执行 selenium 测试,很可能像我一样,您使用了很多 find_element_by_ something。我编写了以下函数来解决此类问题:

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')

于 2015-02-09T16:48:25.047 回答
0

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

driver.save_screenshot('/file/screenshot.png')
于 2013-02-21T04:44:37.043 回答