我如何在python pytest html中添加屏幕截图



首先,我尝试了这篇文章中的解决方案我得到这段代码

import os
import selenium
from selenium import webdriver
import time
from datetime import datetime
import pytest
from selenium import webdriver as selenium_webdriver
from selenium.webdriver.chrome.options import Options

@pytest.fixture()
def setup():
driver = webdriver.Chrome(executable_path=r'E:Python ProjectsStackFieldtestCaseschromedriver.exe')
return driver
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):
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':
feature_request = item.funcargs['request']
driver = feature_request.getfuncargvalue('browser')
driver.save_screenshot('D:/report/scr'+timestamp+'.png')
extra.append(pytest_html.extras.image('D:/report/scr'+timestamp+'.png'))
# always add url to report
extra.append(pytest_html.extras.url('http://www.example.com/'))
xfail = hasattr(report, 'wasxfail')
if (report.skipped and xfail) or (report.failed and not xfail):
# only add additional html on failure
extra.append(pytest_html.extras.image('D:/report/scr.png'))
extra.append(pytest_html.extras.html('<div>Additional HTML</div>'))
report.extra = extra

当我运行这个命令时:pytest——html=report.html——self-contained-html testCases/test_basic.py

返回一个内部错误:INTERNALERROR>Feature_request = item.funcargs['request']INTERNALERROR>KeyError:"请求">

然后我尝试了这个方法:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
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("https://sprint.moravis.com/run/val/adchef/a0bfkgb"))
xfail = hasattr(report, "wasxfail")
if (report.skipped and xfail) or (report.failed and not xfail):
# only add additional html on failure
report_directory = os.path.dirname(item.config.option.htmlpath)
# file_name = str(int(round(time.sleep() *1000)))+".png"
file_name = report.nodeid.replace(": :", "_") + ".png"
destinationFile = os.path.join(report_directory, file_name)
driver.save_screenshot(destinationFile)
if file_name:
html = '<div><img src ="%s" alt="screenshot" style="width:300px:height=200px"'                       ''onclick ="window.open(this.src)" align="right"/></div>' % file_name
extra.append(pytest_html.extras.html(html))
report.extra = extra

def pytest_html_report_title(report):
report.title = "Stackfield report"

我得到了这个错误:INTERNALERROR>driver.save_screenshot (destinationFile)INTERNALERROR>NameError: name 'driver'没有定义

从这里开始我不知道如何继续。

提前感谢!

把setup中的驱动设置为全局的,就像

@pytest.fixture()
def setup():
global driver
driver = webdriver.Chrome(executable_path=r'E:Python ProjectsStackFieldtestCaseschromedriver.exe')
return driver

不能将fixture传递给钩子。你需要做的:

  1. 调用请求夹具。
  2. 调用启动驱动程序的fixture。

应该像这样:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
pytest_html = item.config.pluginmanager.getplugin("html")
outcome = yield
report = outcome.get_result()
extra = getattr(report, "extra", [])
if report.when == "call":
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("path/to/image", img_name)
driver.save_screenshot(img_path)

最新更新