Repository navigation
Expand file tree
/
Copy pathconftest.py
More file actions
91 lines (63 loc) · 2.91 KB
/
Copy pathconftest.py
File metadata and controls
91 lines (63 loc) · 2.91 KB
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
"""
conftest.py
Root-level pytest configuration: fixtures, hooks, and plugins.
"""
from __future__ import annotations
import pytest # type: ignore
from config import settings
from pages import LoginPage, InventoryPage, CartPage, CheckoutPage
from utils.driver_factory import DriverFactory
from utils.logger import get_logger
from utils.screenshot_helper import take_screenshot
log = get_logger("conftest")
# ── Session-scoped base URL fixture ───────────────────────────────────────────
@pytest.fixture(scope="session")
def base_url() -> str:
return settings.BASE_URL
# ── WebDriver fixture (function-scoped = new browser per test) ────────────────
@pytest.fixture()
def driver():
drv = DriverFactory.get_driver()
drv.implicitly_wait(settings.IMPLICIT_WAIT)
drv.set_page_load_timeout(settings.PAGE_LOAD_TIMEOUT)
drv.maximize_window()
log.info("Browser started for test.")
yield drv
log.info("Closing browser.")
drv.quit()
# ── Page-object fixtures ───────────────────────────────────────────────────────
@pytest.fixture()
def login_page(driver):
return LoginPage(driver)
@pytest.fixture()
def inventory_page(driver):
return InventoryPage(driver)
@pytest.fixture()
def cart_page(driver):
return CartPage(driver)
@pytest.fixture()
def checkout_page(driver):
return CheckoutPage(driver)
# ── Authenticated session fixture ──────────────────────────────────────────────
@pytest.fixture()
def authenticated_driver(driver):
"""Opens the app and logs in with the standard user."""
page = LoginPage(driver)
page.open_login_page()
page.login(settings.STANDARD_USER, settings.APP_PASSWORD)
return driver
# ── Auto-screenshot on failure ─────────────────────────────────────────────────
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
rep = outcome.get_result()
if rep.when == "call" and rep.failed:
drv = item.funcargs.get("driver") or item.funcargs.get("authenticated_driver")
if drv:
test_name = item.nodeid.replace("/", "_").replace("::", "_")
path = take_screenshot(drv, name=test_name)
if path:
log.warning("Failure screenshot: %s", path)
# ── pytest-html report title ───────────────────────────────────────────────────
def pytest_html_report_title(report):
report.title = settings.REPORT_TITLE