fix(tradein/browser): повтор evaluate на той же странице — гонка случается ПОСЛЕ load (#2676) #2721

Merged
bot-backend merged 1 commit from fix/2676-inpage-context-retry into main 2026-08-06 10:18:15 +00:00

1 commit

Author SHA1 Message Date
5d30772153 fix(tradein/browser): повтор evaluate на той же странице — гонка навигации случается ПОСЛЕ load (#2676)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 10s
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
Fix-forward к смерженному PR #2716. Прод-проверка того PR показала, что признак
распознаётся (в логе появилась новая ветка), но сам повтор не помогает:

    10:03:49 WARNING страница ушла в навигацию (Error), retry fetch-json с ожиданием load
    10:03:54 ERROR   Page.evaluate: Execution context was destroyed

Воспроизведено вживую дважды (безобидный robots.txt, origin = корень и город) —
обе попытки падают одинаково, при этом `/fetch` того же URL отдаёт 200 и настоящий
robots.txt, то есть площадка не блокирует и прокси жив.

Причина: навигация origin-страницы происходит ПОСЛЕ события load, поэтому ни
settle, ни ожидание load её не опережают, а повтор на СВЕЖЕЙ странице честно
воспроизводит ту же первую навигацию.

Правка:

1. Повтор evaluate на ТОЙ ЖЕ странице: к моменту исключения навигация уже
   случилась, у страницы новый и уже стабильный контекст. Стоит миллисекунды
   против полной ре-навигации.

2. Внешний повтор на свежей странице УБРАН — прод показал, что он не может
   выиграть, а стоил полной ре-навигации. Страховкой остаётся один повтор всего
   запроса на стороне клиента (BrowserFetcher.fetch_json), который был и раньше.

3. JS in-page fetch вынесен в константу (нужен двум вызовам), ожидание load — в
   _wait_for_load_best_effort.

Refs #2676
2026-08-06 15:10:09 +05:00