# conftest.py import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from pathlib import Path import openpyxl @pytest.fixture(scope="session") def browser_options(): options = Options() options.add_argument("--start-maximized") # options.add_argument("--headless") # Optional für CI/CD return options @pytest.fixture(scope="function") def driver(browser_options): """Erstellt einen neuen Browser pro Test""" driver = webdriver.Chrome(options=browser_options) driver.implicitly_wait(10) yield driver driver.quit() @pytest.fixture(scope="function") def wait(driver): """WebDriverWait Instanz""" return WebDriverWait(driver, 20) @pytest.fixture def base_url(): """Basis-URL deiner Anwendung""" return "http://localhost:5173" def pytest_generate_tests(metafunc): """Parametrisiert Tests basierend auf Excel-Dateien im testdata Ordner""" if "testcase_file" in metafunc.fixturenames: testdata_dir = Path("testcases") excel_files = list(testdata_dir.glob("*.xlsx")) # IDs für bessere Testausgabe ids = [f.stem for f in excel_files] metafunc.parametrize("testcase_file", excel_files, ids=ids) @pytest.fixture def test_data(testcase_file): """Lädt Testdaten aus Excel-Datei""" wb = openpyxl.load_workbook(testcase_file) # Eingabedaten aus "in" Sheet input_sheet = wb["in"] input_data = {} groups = {} for row in input_sheet.iter_rows(values_only=True): if row[0]: # Feldname in Spalte A if '_' in row[0]: [remainder, suffix] = row[0].rsplit('_',1) if suffix.isdigit(): [prefix, name] = remainder.split('_',1) if prefix not in groups: groups[prefix] = {} if groups[prefix].get(suffix) is None: groups[prefix][suffix] = {} groups[prefix][suffix][name] = row[1] else: input_data[row[0]] = row[1] else: input_data[row[0]] = row[1] # Wert in Spalte B input_data.update(groups) # Erwartete Ausgaben aus "out" Sheet output_sheet = wb["out"] expected_data = {} expected_groups = {} for row in input_sheet.iter_rows(values_only=True): if row[0]: # Feldname in Spalte A if '_' in row[0]: [remainder, suffix] = row[0].rsplit('_',1) if suffix.isdigit(): [prefix, name] = remainder.split('_',1) if prefix not in expected_groups: expected_groups[prefix] = {} if expected_groups[prefix].get(suffix) is None: expected_groups[prefix][suffix] = {} expected_groups[prefix][suffix][name] = row[1] else: expected_data[row[0]] = row[1] else: expected_data[row[0]] = row[1] # Wert in Spalte B expected_data.update(expected_groups) return { "input": input_data, "expected": expected_data, "filename": testcase_file.name }