feat: add codegen.py for visual test recording with GOST TLS support
This commit is contained in:
25
README.md
25
README.md
@ -372,17 +372,32 @@ Python-код, который воспроизводит твои действи
|
|||||||
|
|
||||||
### Запуск рекордера
|
### Запуск рекордера
|
||||||
|
|
||||||
|
#### Вариант 1: Универсальный запуск с поддержкой ГОСТ TLS (рекомендуемый)
|
||||||
|
Штатная команда `playwright codegen` не умеет работать со сторонними браузерами напрямую. Для записи тестов на сайтах с **ГОСТ TLS** (а также обычным TLS) используйте встроенный скрипт `codegen.py`:
|
||||||
|
|
||||||
```powershell
|
```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
|
||||||
|
|
||||||
# Открыть браузер с рекордером и сохранить результат в файл
|
# Открыть рекордер и сразу сохранить результат в файл
|
||||||
.\venv\Scripts\playwright.exe codegen https://vet.goznak.ru --output tests\codegen_draft.py
|
.\venv\Scripts\playwright.exe codegen https://vet.goznak.ru --output tests\codegen_draft.py
|
||||||
```
|
```
|
||||||
|
|
||||||
Откроются два окна:
|
При запуске откроются два окна:
|
||||||
- **Браузер** — управляй им как обычно: кликай, заполняй формы, переходи по разделам
|
- **Браузер (Chromium-GOST или Playwright Chromium)** — кликайте, заполняйте формы и переходите по разделам.
|
||||||
- **Playwright Inspector** — в реальном времени показывает сгенерированный код
|
- **Playwright Inspector** — окно записи, в котором в реальном времени формируется Python-код.
|
||||||
|
|
||||||
### Порядок работы
|
### Порядок работы
|
||||||
|
|
||||||
|
|||||||
120
codegen.py
Normal file
120
codegen.py
Normal file
@ -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()
|
||||||
Reference in New Issue
Block a user