我正在使用nosetests 运行selenium webdriver 测试。每当鼻子测试失败时,我想捕获屏幕截图。我怎样才能以最有效的方式做到这一点,无论是使用 webdriver、python 还是 nosetests 功能?
4 回答
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()
首先,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
如有必要,我在里面分析并创建屏幕截图。
也许您设置了不同的测试,但根据我的经验,您需要手动构建这种类型的功能并在失败时重复它。如果您正在执行 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')
在 Python 中,您可以使用以下代码:
driver.save_screenshot('/file/screenshot.png')