182 lines
5.5 KiB
Python
182 lines
5.5 KiB
Python
# encoding: utf-8
|
|
"""
|
|
项目自定义钩子文件
|
|
"""
|
|
from pathlib import Path
|
|
import allure
|
|
import pytest
|
|
from playwright.sync_api import sync_playwright
|
|
from slugify import slugify
|
|
from utils.constant import *
|
|
|
|
'''
|
|
@author: sean
|
|
@file: conftest.py
|
|
@time: 2021/9/13
|
|
@desc:
|
|
'''
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def page_auto(request):
|
|
env_config = request.config.getoption('environment')
|
|
base_url = request.config.getoption('base_url')
|
|
with sync_playwright() as play:
|
|
if os.getenv('DOCKER_RUN') or env_config == 'PIPELINE':
|
|
browser = play.chromium.launch(headless=True, args=['--no-sandbox'])
|
|
else:
|
|
browser = play.chromium.launch(headless=False)
|
|
# create a new incognito browser context.
|
|
context = browser.new_context(base_url=base_url)
|
|
# create a new page in a pristine context.
|
|
page = context.new_page()
|
|
global PAGE
|
|
PAGE = page
|
|
yield page
|
|
browser.close()
|
|
|
|
|
|
PAGE = None
|
|
|
|
|
|
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
|
|
def pytest_runtest_makereport(item):
|
|
pytest_html = item.config.pluginmanager.getplugin('html')
|
|
|
|
# 获取钩子方法的调用结果
|
|
outcome = yield
|
|
# 从调用结果中获取测试结果
|
|
test_result = outcome.get_result()
|
|
test_result.extra = []
|
|
|
|
# If the marker match one of the testing types, then mention it in the report
|
|
types = ["smoke", "hotlink"]
|
|
for type in types:
|
|
marker_priority = item.get_closest_marker(type)
|
|
if marker_priority:
|
|
item.config._metadata["Test Type"] = marker_priority.name
|
|
|
|
print(marker_priority)
|
|
|
|
# 获取测试方法的参数
|
|
if "page" not in item.funcargs:
|
|
return "page not in item.funcargs"
|
|
page = item.funcargs["page"]
|
|
|
|
if test_result.when in ["setup", "call"]:
|
|
xfail = hasattr(test_result, 'wasxfail')
|
|
if test_result.failed or (test_result.skipped and xfail):
|
|
allure.attach(page.screenshot(), name='screenshot', attachment_type=allure.attachment_type.PNG)
|
|
allure.attach(page.content(), name='html_source', attachment_type=allure.attachment_type.HTML)
|
|
if item.config.option.htmlpath is not None:
|
|
report_dir = os.path.dirname(item.config.option.htmlpath)
|
|
screen_img = str(Path("images") / f"{slugify(item.nodeid)}.png")
|
|
capture_screenshot(report_dir, screen_img, page)
|
|
if screen_img:
|
|
html = '<div><img src="%s" alt="screenshot" style="height:360px;" ' \
|
|
'onclick="window.open(this.src)" align="right"/></div>' % screen_img
|
|
test_result.extra.append(pytest_html.extras.html(html))
|
|
|
|
|
|
def capture_screenshot(report_dir, screen_img, page):
|
|
"""
|
|
To capture screenshot and save it to 'images' folder inside the specific html report directory.
|
|
"""
|
|
screenshot_dir = str(Path(report_dir) / os.path.dirname(screen_img))
|
|
screen_img = str(Path(report_dir) / screen_img)
|
|
if not os.path.exists(screenshot_dir):
|
|
os.makedirs(screenshot_dir)
|
|
|
|
page.screenshot(path=screen_img)
|
|
|
|
|
|
def pytest_addoption(parser):
|
|
"""
|
|
To get password from command line argument
|
|
"""
|
|
parser.addoption("--password", action="store", default="test", help="password")
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def password(request):
|
|
return request.config.getoption("--password")
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def baseUrl(request):
|
|
return request.config.getoption("--base-url")
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def headed(request):
|
|
return request.config.getoption("--headed")
|
|
|
|
|
|
@pytest.fixture()
|
|
def browser_context_args(browser_context_args):
|
|
"""
|
|
To override the browser context
|
|
https://playwright.dev/python/docs/api/class-browser#browser-new-context
|
|
"""
|
|
return {
|
|
**browser_context_args,
|
|
# "storage_state": {
|
|
# "cookies": [
|
|
# {
|
|
# "name": "token",
|
|
# "value": response["token"],
|
|
# "path": path,
|
|
# "domain": domain,
|
|
# },
|
|
# ]
|
|
# },
|
|
# "record_video_dir": "videos"
|
|
"viewport": {
|
|
"width": 1920,
|
|
"height": 1080,
|
|
},
|
|
"accept_downloads": True
|
|
}
|
|
|
|
# @pytest.fixture
|
|
# def context(context):
|
|
# """
|
|
# To override the default timeout
|
|
# """
|
|
# context.set_default_timeout(45 * 1000) # default to 30 seconds
|
|
# # context.accept_downloads(True)
|
|
# yield context
|
|
|
|
|
|
# def pytest_addoption(parser):
|
|
# group = parser.getgroup("playwright", "Playwright")
|
|
# group.addoption("--env",
|
|
# action="store",
|
|
# dest="environment",
|
|
# default="DEBUG",
|
|
# help="environment: DEBUG or PIPELINE")
|
|
#
|
|
# group.addoption("--url",
|
|
# action="store",
|
|
# dest="base_url",
|
|
# help="Base Url for Test")
|
|
|
|
|
|
# def pytest_html_report_title(report):
|
|
# report.title = "Test Report"
|
|
#
|
|
#
|
|
# def pytest_html_results_summary(prefix, summary, postfix):
|
|
# # To get the summary info from 'info.json' and display in HTML report
|
|
# # Make sure the file is located in the project root
|
|
# info_file = os.path.dirname(__file__) + '/info.json'
|
|
#
|
|
# if os.path.exists(info_file):
|
|
# with open(info_file) as f:
|
|
# data = json.load(f)
|
|
# f.close()
|
|
#
|
|
# if data:
|
|
# summary = data['summary']
|
|
# prefix.extend([html.p(summary + "")])
|