"""Модуль pages содержит фикстуры и функции для работы с Playwright. Предоставляет инструменты для управления браузером, контекстами и страницами в тестах pytest, включая настройку параметров запуска. """ import ast import pytest from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright, Playwright from _pytest.config.argparsing import Parser from _pytest.fixtures import FixtureRequest def pytest_addoption(parser: Parser): """Добавляет опции командной строки для настройки браузера. Args: parser: Парсер pytest для добавления опций. Опции: --bn: Браузер (chrome, remote_chrome, firefox) --h: Режим headless (True/False) --s: Размер окна {'width': int, 'height': int} --slow: Задержка между действиями (мс) --t: Таймаут по умолчанию (мс) --l: Локаль браузера """ parser.addoption('--bn', action='store', default="chrome", help="Choose browser: chrome, remote_chrome or firefox") parser.addoption('--h', action='store', default=False, help='Choose headless: True or False') parser.addoption('--s', action='store', default="{'width': 1600, 'height': 900}", help='Size window: width,height') # Закомментированные альтернативные размеры окон # parser.addoption('--s', action='store', default="{'width': 1920, 'height': 1080}", # help='Size window: width,height') # parser.addoption('--s', action='store', default="{'width': 1920, 'height': 300}", # help='Size window: width,height') # parser.addoption('--s', action='store', default="{'width': 300, 'height': 420}", # help='Size window: width,height') parser.addoption('--slow', action='store', default=200, help='Choose slow_mo for robot action') parser.addoption('--t', action='store', default=60000, help='Choose timeout') parser.addoption('--l', action='store', default='ru-RU', help='Choose locale') # Закомментированная опция для Qase # parser.addini('qs_to_api_token', default=os.getenv("QASE_TOKEN"), help='Qase app token') @pytest.fixture(scope='class') def browser(request: FixtureRequest) -> Page: """Фикстура для управления экземпляром браузера. Args: request: Объект запроса pytest для доступа к конфигурации. Returns: Page: Экземпляр страницы браузера. Yields: Page: Страница для использования в тестах. Note: Автоматически закрывает браузер после тестов. """ playwright = sync_playwright().start() # Выбор браузера на основе параметра командной строки if request.config.getoption("bn") == 'remote_chrome': browser = get_remote_chrome(playwright, request) context = get_context(browser, request, 'remote') page_data = context.new_page() elif request.config.getoption("bn") == 'firefox': browser = get_firefox_browser(playwright, request) context = get_context(browser, request, 'local') page_data = context.new_page() elif request.config.getoption("bn") == 'chrome': browser = get_chrome_browser(playwright, request) context = get_context(browser, request, 'local') page_data = context.new_page() else: browser = get_chrome_browser(playwright, request) context = get_context(browser, request, 'local') page_data = context.new_page() yield page_data # Очистка после завершения тестов for context in browser.contexts: context.close() browser.close() playwright.stop() def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -> Browser: """Создает и возвращает экземпляр Firefox браузера. Args: playwright: Экземпляр Playwright. request: Объект запроса pytest. Returns: Browser: Экземпляр Firefox. """ return playwright.firefox.launch( headless=request.config.getoption("h"), slow_mo=request.config.getoption("slow"), ) def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -> Browser: """Создает и возвращает экземпляр Chrome браузера. Args: playwright: Экземпляр Playwright. request: Объект запроса pytest. Returns: Browser: Экземпляр Chrome. """ return playwright.chromium.launch( headless=request.config.getoption("h"), slow_mo=request.config.getoption("slow"), args=['--s'] ) def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -> Browser: """Создает экземпляр Chrome для удаленного запуска. Args: playwright: Экземпляр Playwright. request: Объект запроса pytest. Returns: Browser: Экземпляр Chrome в headless режиме. """ return playwright.chromium.launch( headless=True, slow_mo=request.config.getoption("slow") ) def get_context(browser: Browser, request: FixtureRequest, start: str) -> BrowserContext: """Создает и настраивает контекст браузера. Args: browser: Экземпляр браузера. request: Объект запроса pytest. start: Тип запуска ('local' или 'remote'). Returns: BrowserContext: Настроенный контекст. """ if start == 'local': # current_viewport = json.loads(request.config.getoption('--s')) context = browser.new_context( # no_viewport=True, viewport= ast.literal_eval(request.config.getoption('--s')), locale=request.config.getoption('l') ) context.set_default_timeout( timeout=request.config.getoption('t') ) # Пример добавления кук (закомментировано) # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}]) return context elif start == 'remote': context = browser.new_context( viewport=ast.literal_eval(request.config.getoption('--s')), locale=request.config.getoption('l') ) context.set_default_timeout( timeout=request.config.getoption('t') ) # Пример добавления кук (закомментировано) # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}]) return context @pytest.fixture(scope="function") def return_back(browser: Page): """Фикстура для возврата на предыдущую страницу. Args: browser: Экземпляр страницы браузера. """ browser.go_back()