diff --git a/README.md b/README.md index 28799bd..0ab9878 100644 --- a/README.md +++ b/README.md @@ -372,17 +372,32 @@ Python-код, который воспроизводит твои действи ### Запуск рекордера +#### Вариант 1: Универсальный запуск с поддержкой ГОСТ TLS (рекомендуемый) +Штатная команда `playwright codegen` не умеет работать со сторонними браузерами напрямую. Для записи тестов на сайтах с **ГОСТ TLS** (а также обычным TLS) используйте встроенный скрипт `codegen.py`: + ```powershell -# Открыть браузер с рекордером (без авторизации) +# Запуск для URL по умолчанию из .env (с автоопределением TLS и выбором браузера): +.\venv\Scripts\python.exe codegen.py + +# Принудительный запуск в режиме ГОСТ TLS (через Chromium-GOST): +.\venv\Scripts\python.exe codegen.py --gost + +# Запуск для произвольного адреса: +.\venv\Scripts\python.exe codegen.py https://vet.goznak.ru +``` + +#### Вариант 2: Штатный запуск (только для сайтов со стандартным TLS) +```powershell +# Открыть встроенный Chromium с рекордером .\venv\Scripts\playwright.exe codegen https://vet.goznak.ru -# Открыть браузер с рекордером и сохранить результат в файл +# Открыть рекордер и сразу сохранить результат в файл .\venv\Scripts\playwright.exe codegen https://vet.goznak.ru --output tests\codegen_draft.py ``` -Откроются два окна: -- **Браузер** — управляй им как обычно: кликай, заполняй формы, переходи по разделам -- **Playwright Inspector** — в реальном времени показывает сгенерированный код +При запуске откроются два окна: +- **Браузер (Chromium-GOST или Playwright Chromium)** — кликайте, заполняйте формы и переходите по разделам. +- **Playwright Inspector** — окно записи, в котором в реальном времени формируется Python-код. ### Порядок работы diff --git a/codegen.py b/codegen.py new file mode 100644 index 0000000..8b58f9f --- /dev/null +++ b/codegen.py @@ -0,0 +1,120 @@ +""" +Инструмент запуска визуального рекордера Playwright Codegen +с автоматической поддержкой Стандартного и ГОСТ TLS. + +Использование: + .\\venv\\Scripts\\python.exe codegen.py [URL] [опции] + +Примеры: + # Автоопределение TLS для URL из .env (по умолчанию): + .\\venv\\Scripts\\python.exe codegen.py + + # Запуск для конкретного URL: + .\\venv\\Scripts\\python.exe codegen.py https://vet.goznak.ru + + # Принудительно через Chromium-GOST: + .\\venv\\Scripts\\python.exe codegen.py --gost + + # Принудительно через стандартный Chromium: + .\\venv\\Scripts\\python.exe codegen.py --standard +""" +import argparse +import os +import sys +# pyrefly: ignore [missing-import] +from dotenv import load_dotenv +# pyrefly: ignore [missing-import] +from playwright.sync_api import sync_playwright + +from tests.utils.tls import detect_tls_mode, find_gost_browser_executable + +load_dotenv() +DEFAULT_URL = os.getenv("BASE_URL", "https://vet.goznak.ru") + + +def main(): + parser = argparse.ArgumentParser( + description="Визуальный рекордер Playwright с поддержкой Chromium-GOST и стандартного Chromium." + ) + parser.add_argument( + "url", + nargs="?", + default=DEFAULT_URL, + help=f"Целевой URL портала (по умолчанию из .env: {DEFAULT_URL})", + ) + parser.add_argument( + "--gost", + action="store_true", + help="Принудительно запустить рекордер через Chromium-GOST", + ) + parser.add_argument( + "--standard", + action="store_true", + help="Принудительно запустить рекордер через встроенный Chromium Playwright", + ) + + args = parser.parse_args() + + # Определение режима TLS + if args.gost: + is_gost = True + tls_desc = "Принудительно (ГОСТ TLS)" + elif args.standard: + is_gost = False + tls_desc = "Принудительно (Стандартный TLS)" + else: + is_gost, tls_desc = detect_tls_mode(args.url) + + print(f"\n{'=' * 70}") + print("ЗАПУСК ВИЗУАЛЬНОГО РЕКОРДЕРА PLAYWRIGHT") + print(f"Целевой URL: {args.url}") + print(f"Режим TLS: {tls_desc}") + + # Включаем режим отладчика/инспектора Playwright + os.environ["PWDEBUG"] = "1" + + with sync_playwright() as playwright: + if is_gost: + gost_path = find_gost_browser_executable() + if not gost_path or not os.path.exists(gost_path): + print("\n[ОШИБКА] Chromium-GOST не найден в системе!") + print("Скачайте его с https://github.com/deemru/chromium-gost/releases") + print("и распакуйте в %LOCALAPPDATA%\\Chromium-Gost,") + print("либо укажите путь в .env: CHROMIUM_GOST_PATH=...") + sys.exit(1) + print(f"Браузер: Chromium GOST ({gost_path})") + browser = playwright.chromium.launch( + executable_path=gost_path, + headless=False, + ) + else: + print("Браузер: Chromium (Playwright)") + browser = playwright.chromium.launch(headless=False) + + context = browser.new_context( + ignore_https_errors=True, + viewport={"width": 1920, "height": 1080}, + ) + page = context.new_page() + + print(f"{'=' * 70}") + print("1. Открылись окна: Браузер и Playwright Inspector.") + print("2. В окне инспектора нажмите кнопку записи (красный кружок 'Record').") + print("3. Кликайте и заполняйте формы — код генерируется в окне инспектора.") + print("4. Для завершения просто закройте окно браузера.") + print(f"{'=' * 70}\n") + + try: + page.goto(args.url) + except Exception as e: + print(f"Переход на {args.url}: {e}") + + # page.pause() активирует панель рекордера/инспектора + page.pause() + + context.close() + browser.close() + + +if __name__ == "__main__": + main()