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
网友评论