Python&selenium 自动化测试框架之用例执行失败截图

2022-08-17  本文已影响0人  乘风破浪的姐姐

Python&selenium 自动化测试框架之用例执行失败截图功能
用例执行失败后自动截图到指定文件夹,并在allure报告中失败用例中自动显示该截图。
需要用到pytest中的hook函数,如下:

该代码可直接复用,无需修改

# 用例失败后自动截图
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    获取每个用例的钩子函数
    :param item:
    :param call:
    :return:
    """
    outcome = yield
    rep = outcome.get_result()
    # 以下为实现异常截图的代码:
    # rep.when可选参数有call、setup、teardown,
    # call表示为用例执行环节、setup、teardown为环境初始化和清理环节
    # 这里只针对用例执行且失败的用例进行异常截图
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            if "tmpdir" in item.fixturenames:
                extra = " (%s) " % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        item.name = item.name.encode("utf-8").decode("unicode-escape")

        file_name = '{}.png'.format(str(round(time.time() * 1000)))
        path = os.path.join(PRPORE_SCREEN_DIR, file_name)

        driver.save_screenshot(path)

        if hasattr(driver, "get_screenshot_as_png"):
            with allure.step("添加失败截图"):
                # get_screenshot_as_png实现截图并生成二进制数据
                # allure.attach直接将截图二进制数据附加到allure报告中
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)
                logger.info("错误页面截图成功,图表保存的路径:{}".format(path))

注意:因为上述方法中最后一行用到了driver,所以在conftest.py中初始化时需要定义全局driver。
整体conftest.py如下:

import os
import allure
import pytest
from webdriver_helper import get_webdriver


driver = None

@pytest.fixture(scope='session',name="mydriver")
def driver(request):
    global driver
    driver = get_webdriver()
    driver.maximize_window()
    driver.implicitly_wait(5)
  
    def end():
        driver.quit()

    request.addfinalizer(end)  # 终结函数
    # 这里为什么不用yield呢因为yield不能return,addfinalizer这个功能可以实现饿yield功能一样
    # 而且可以return参数传给后面的用例
    return driver


# 用例失败后自动截图
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    获取每个用例的钩子函数
    :param item:
    :param call:
    :return:
    """
    outcome = yield
    rep = outcome.get_result()
    # 以下为实现异常截图的代码:
    # rep.when可选参数有call、setup、teardown,
    # call表示为用例执行环节、setup、teardown为环境初始化和清理环节
    # 这里只针对用例执行且失败的用例进行异常截图
    if rep.when == "call" and rep.failed:
        mode = "a" if os.path.exists("failures") else "w"
        with open("failures", mode) as f:
            if "tmpdir" in item.fixturenames:
                extra = " (%s) " % item.funcargs["tmpdir"]
            else:
                extra = ""
            f.write(rep.nodeid + extra + "\n")
        item.name = item.name.encode("utf-8").decode("unicode-escape")

        file_name = '{}.png'.format(str(round(time.time() * 1000)))
        path = os.path.join(PRPORE_SCREEN_DIR, file_name)

        driver.save_screenshot(path)

        if hasattr(driver, "get_screenshot_as_png"):
            with allure.step("添加失败截图"):
                # get_screenshot_as_png实现截图并生成二进制数据
                # allure.attach直接将截图二进制数据附加到allure报告中
                allure.attach(driver.get_screenshot_as_png(), "失败截图", allure.attachment_type.PNG)
                logger.info("错误页面截图成功,图表保存的路径:{}".format(path))

使用命令执行测试用例,结果如下:


image.png

打开测试报告:


image.png
上一篇 下一篇

猜你喜欢

热点阅读