美文网首页
Python&selenium 自动化测试框架之用例执行失败截图

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

作者: 乘风破浪的姐姐 | 来源:发表于2022-08-17 11:01 被阅读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

    相关文章

      网友评论

          本文标题:Python&selenium 自动化测试框架之用例执行失败截图

          本文链接:https://www.haomeiwen.com/subject/yahdgrtx.html