Search code examples
seleniumpytestpytest-html

How I can save multiple screenshots when the test is fail


I use selenium with pytest to do some automation testing and I use a fixture to take a screenshot when it fails here is the code for the fixture:


    timestamp = datetime.now().strftime('%H-%M-%S')

    pytest_html = item.config.pluginmanager.getplugin('html')
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, 'extra', [])
    if report.when == 'call':
        # always add url to report
        # extra.append(pytest_html.extras.url('E:\Python Projects\StackField\screenshot'))
        xfail = hasattr(report, 'wasxfail')
        if (report.skipped and xfail) or (report.failed and not xfail):
            feature_request = item.funcargs["request"]
            driver = feature_request.getfixturevalue("setup")
            img_name = "name.png"
            img_path = os.path.join("E:\Python Projects\StackField\screenshot", img_name)
            driver.save_screenshot(img_path)
            # extra.append(pytest_html.extras.image('E:\Python Projects\StackField\screenshot' + timestamp + '.png'))

        if (report.skipped and xfail) or (report.failed and not xfail):
            # only add additional html on failure
            extra.append(pytest_html.extras.image(img_path))
            extra.append(pytest_html.extras.html('<div>Additional HTML</div>'))
        report.extra = extra

And I got an issue when more than 1 test is failed the same screenshot is added to the report my next question is how can I add more than 1 screenshot inside?

Thank you in advance!


Solution

  • Seems you save all screenshots with the same name.

    Try to set the unique name for the screenshot:

    from random import randrange
    
    if (report.skipped and xfail) or (report.failed and not xfail):
        feature_request = item.funcargs["request"]
        driver = feature_request.getfixturevalue("setup")
        timestamp = datetime.now().strftime('%H-%M-%S')
        img_name = "name" + timestamp + ".png"
        # (even better also add some random number in advance "name" + timestamp + randrange(100) + ".png"
    
        img_path = os.path.join("E:\Python Projects\StackField\screenshot", img_name)
        driver.save_screenshot(img_path)