fix(tradein/browser): гонка «execution context destroyed» — восстановимая, ретрай без relaunch (#2676) #2716

Merged
bot-backend merged 1 commit from fix/2676-sidecar-recoverable into main 2026-08-06 09:44:23 +00:00

1 commit

Author SHA1 Message Date
f218f85585 fix(tradein/browser): гонка «execution context destroyed» — восстановимая, ретрай без relaunch (#2676)
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
`_fetch_json_once` делает goto(origin, domcontentloaded) → фиксированный settle →
page.evaluate. Если страница за это время уходит в клиентскую навигацию, playwright
рвёт JS-контекст и бросает «Execution context was destroyed». Такая ошибка не
попадала ни в одну ветку восстановления: `_is_browser_crash` матчит только закрытие
цели/браузера/соединения — значит для сайдкара это окончательный отказ, 500 наверх.

Правка:

1. `_is_page_context_lost` — отдельный признак, не смешанный с крашем браузера.
   Маркер взят из САМОГО playwright (driver 1.60.0, coreBundle.js в образе
   сайдкара), а не из строки в нашем логе: обе формы сообщения — короткая и
   «..., most likely because of a navigation.» — имеют общий префикс.

2. Повтор на СВЕЖЕЙ странице без `_relaunch_browser`: браузер жив, умерла одна
   страница. Relaunch стоил бы ~10-20с и тёплый профиль инстанса (cookies,
   фингерпринт) ради здорового браузера.

3. Повтор ждёт `load` (FETCH_JSON_LOAD_WAIT_MS, best-effort). Без этого повтор
   попадает ровно в то же окно навигации: в логе один и тот же адрес падал дважды
   подряд, то есть гонка воспроизводится, а не «рассасывается». Happy-path не
   удлиняется — ожидание только на ретрае.

Ретрай строго один и только по этому признаку: чужая ошибка (напр.
ERR_PROXY_CONNECTION_FAILED) уезжает наверх сразу — повтор невосстановимого стоит
полной ре-навигации на каждый дом.

Refs #2676
2026-08-06 14:35:43 +05:00