-
Notifications
You must be signed in to change notification settings - Fork 100
/
Copy pathconftest.py
148 lines (124 loc) · 4.55 KB
/
conftest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import os
import pytest
from py.xml import html
from selenium import webdriver
from selenium.webdriver import Remote
from selenium.webdriver.chrome.options import Options as CH_Options
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from config import RunConfig
# 项目目录配置
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
REPORT_DIR = BASE_DIR + "/测试报告/"
# 设置用例描述表头
def pytest_html_results_table_header(cells):
cells.insert(2, html.th('用例描述'))
cells.pop()
# 设置用例描述表格
def pytest_html_results_table_row(report, cells):
cells.insert(2, html.td(report.description))
cells.pop()
@pytest.mark.hookwrapper
def pytest_runtest_makereport(item):
"""
用于向测试用例中添加用例的开始时间、内部注释,和失败截图等.
:param item:
"""
pytest_html = item.config.pluginmanager.getplugin('html')
outcome = yield
report = outcome.get_result()
report.description = description_html(item.function.__doc__)
extra = getattr(report, 'extra', [])
if report.when == 'call' or report.when == "setup":
xfail = hasattr(report, 'wasxfail')
if (report.skipped and xfail) or (report.failed and not xfail):
case_path = report.nodeid.replace("::", "_") + ".png"
if "[" in case_path:
case_name = case_path.split("-")[0] + "].png"
else:
case_name = case_path
capture_screenshots(case_name)
img_path = "image/" + case_name.split("/")[-1]
if img_path:
html = '<div><img src="%s" alt="screenshot" style="width:304px;height:228px;" ' \
'onclick="window.open(this.src)" align="right"/></div>' % img_path
extra.append(pytest_html.extras.html(html))
report.extra = extra
def description_html(desc):
"""
将用例中的描述转成HTML对象
:param desc: 描述
:return:
"""
if desc is None:
return "No case description"
desc_ = ""
for i in range(len(desc)):
if i == 0:
pass
elif desc[i] == '\n':
desc_ = desc_ + ";"
else:
desc_ = desc_ + desc[i]
desc_lines = desc_.split(";")
desc_html = html.html(
html.head(
html.meta(name="Content-Type", value="text/html; charset=latin1")),
html.body(
[html.p(line) for line in desc_lines]))
return desc_html
def capture_screenshots(case_name):
"""
配置用例失败截图路径
:param case_name: 用例名
:return:
"""
global driver
file_name = case_name.split("/")[-1]
#if RunConfig.NEW_REPORT is None:
# raise NameError('没有初始化测试报告目录!')
#else:
# image_dir = os.path.join(RunConfig.NEW_REPORT, "image", file_name)
# RunConfig.driver.save_screenshot(image_dir)
image_dir = os.path.join(RunConfig.NEW_REPORT, "image", file_name)
RunConfig.driver.save_screenshot(image_dir)
# 启动浏览器
@pytest.fixture(scope='session', autouse=True)
def browser():
"""
全局定义浏览器驱动
:return:
"""
global driver
if RunConfig.driver_type == "chrome":
# 本地chrome浏览器
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.maximize_window()
elif RunConfig.driver_type == "chrome-headless":
# chrome headless模式(无头模式),不打开浏览器界面,执行的UI自动化
chrome_options = CH_Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument('--disable-gpu')
# chrome_options.add_argument("--window-size=1920x1080")
driver = webdriver.Chrome(
options=chrome_options,
service=ChromeService(ChromeDriverManager().install()))
elif RunConfig.driver_type == "grid":
# 通过远程节点运行
driver = Remote(command_executor='http://localhost:4444/wd/hub',
desired_capabilities={
"browserName": "chrome",
})
driver.set_window_size(1920, 1080)
else:
raise NameError("driver驱动类型定义错误!")
RunConfig.driver = driver
return driver
# 关闭浏览器
@pytest.fixture(scope="session", autouse=True)
def browser_close():
yield driver
driver.quit()
print("test end!")
if __name__ == "__main__":
capture_screenshots("test_dir/test_baidu.py")