# Исходный код fixtures.pages

    """Модуль 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()