在使用web自動化測試中,用例失敗則自動截圖的網上也有,但實際能落地的卻沒看到,現總結在在實際應用中失敗截圖的幾種方法:web
1、使用unittest框架截圖方法:框架
一、在tearDown中寫入截圖的功能,以下:ide
import sys
class SeleniumTest(unittest2.TestCase): ... def tearDown(self): if sys.exc_info()[0]: test_method_name = self._testMethodName self.driver.save_screenshot("Screenshots/%s.png" % test_method_name) super(SeleniumTest, self).tearDown()
注意,self._testMethodName是unittest特有的,在其它框架中不使用函數
在測試中,若是用例失敗,就會自動以對應的測試函數名爲文件名截圖存儲測試
二、自定義函數,重寫unittest中的run方法:優化
class ScreenShotUtil: "Screenshot Utility Class" @staticmethod def take_screenshot(webdriver, file_name="error.png"): """ @param webdriver: WebDriver. @type webdriver: WebDriver @param file_name: Name to label this screenshot. @type file_name: str """ if isinstance(webdriver, remote.webdriver.WebDriver): # Get Screenshot over the wire as base64 base64_data = webdriver.get_screenshot_as_base64() screenshot_data = base64.decodestring(base64_data) screenshot_file = open(filename, "w") screenshot_file.write(screenshot_data) screenshot_file.close() else: webdriver.save_screenshot(filename)
在引中unittest時,重寫run方法:this
... class ScreenCaptureTestCase(unittest.TestCase): ... # Defining an init method so we can pass it a webdriver. def __init__(self, methodName='runTest', webdriver=None, screenshot_util=None): super(WDBaseTest, self).__init__(methodName) if webdriver_provider == None: self._webdriver = WebDriverSingleton.get_instance() else: self._webdriver = webdriver if screenshot_util == None: self._screenshot_util = WebScreenShotUtil else: self._screenshot_util = screenshot_util ... def run(self, result=None): """ 這裏重寫run方法 """ orig_result = result if result is None: result = self.defaultTestResult() startTestRun = getattr(result, 'startTestRun', None) if startTestRun is not None: startTestRun() ... more pyunit code ... except self.failureException: # Insert our Take Screenshot on test failure code. fname = str(self).replace("(", "").replace(")", "").replace(" ", "_") fmt='%y-%m-%d_%H.%M.%S_.PNG' filename = datetime.datetime.now().strftime(fmt) self._screenshot_util.take_screenshot(self._webdriver, filename) result.addFailure(self, sys.exc_info()) ... more pyunit code... except: # Do the same thing again for errors. fname = str(self).replace("(", "").replace(")", "").replace(" ", "_") fmt='%y-%m-%d_%H.%M.%S_.PNG' filename = datetime.datetime.now().strftime(fmt) self._screenshot_util.take_screenshot(self._webdriver, filename) result.addError(self, sys.exc_info()) ...
完成後,測試時,失敗則會已時間來截圖,固然你也能夠將filename按你喜愛定義spa
2、nose框架失敗截圖code
nose框架是unittest的優化,在實際使用中能夠繼承unittest.TestCase的方法後繼續使用一中的方法1,若是沒導入unittest.TestCase時,也能夠使用方法1,但要做小改動,以下:blog
一、tearDown寫截圖
class SeleniumTest(unittest2.TestCase): ... def tearDown(self): if sys.exc_info()[0]: test_method_name = test_names = [n for n in dir(self) if n.startswith('test_')][0] #注意了,這裏與unittest的不同 self.driver.save_screenshot("Screenshots/%s.png" % test_method_name) super(SeleniumTest, self).tearDown()
二、修改nose源碼,未完待續