Automatic screenshots when test fail by Selenium Webdriver in Python Automatic screenshots when test fail by Selenium Webdriver in Python selenium selenium

Automatic screenshots when test fail by Selenium Webdriver in Python


do some webdriver stuff in Firefox... save screenshot on any exception to a dated image file:

from datetime import datetimefrom selenium import webdriverbrowser = webdriver.Firefox()try:    # do some webdriver stuff hereexcept Exception as e:    print e    now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')    browser.get_screenshot_as_file('screenshot-%s.png' % now)


Another method would be to add the following to your tearDown method:

if sys.exc_info()[0]:    test_method_name = self._testMethodName    self.driver.save_screenshot("Screenshots/%s.png" % test_method_name)

This would be assuming a test class like this:

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()    def test_1(self):        ...    def test_2(self):        ...


For Future reference/People here is a solution that works in Python3, that works both for an Exception and on a failed Assert.

(Based on https://stackoverflow.com/a/23176373/9427691)

#!/usr/bin/env python"""An Example code to show the set-up with screen-shot on exception."""import unittestfrom selenium import webdriverclass TestDemo(unittest.TestCase):    """An Example test Case, to show off the set-up of a screen-shot on exception."""    def setUp(self):        """Set up the Firefox Browser and the Tear Down."""        self.driver = webdriver.Firefox()        self.driver.delete_all_cookies()        # NOTE: In addCleanup, the first in, is executed last.        self.addCleanup(self.driver.quit)        self.addCleanup(self.screen_shot)        self.driver.implicitly_wait(5)    def screen_shot(self):        """Take a Screen-shot of the drive homepage, when it Failed."""        for method, error in self._outcome.errors:            if error:                self.driver.get_screenshot_as_file("screenshot" + self.id() + ".png")    def test_demo(self):        """A test case that fails because of missing element."""        self.driver.get("http://www.google.com")        self.driver.find_element_by_css_selector("div.that-does-not-exist")    def test_demo2(self):        """A test case that fails because assert."""        self.driver.get("https://stackoverflow.com")        self.assertEqual(True, False)if __name__ == '__main__':    unittest.main(verbosity=2)

The

self._outcome.errors

are Python3 only, so for Python2 use

self._outcomeForDoCleanups.errors

instead.

For the ones that only want a Screen-shot on exceptions. You should take a look at this link: http://blog.likewise.org/2015/01/automatically-capture-browser-screenshots-after-failed-python-ghostdriver-tests/