fix(tradein/browser): переход с Яндекса на площадку должен быть настоящим, а не заявленным #3260

Merged
lekss361 merged 1 commit from feat/browser-real-search-clickthrough into main 2026-08-29 20:44:26 +00:00
Owner

Что не так с #3258

Та правка научила якорную вкладку заходить на выдачу через поиск Яндекса, но две ветки из трёх подставляли Referer, которого мы не заработали:

ветка ставила Referer переход был?
клик по результату удался URL выдачи Яндекса да
ссылку в выдаче не нашли https://yandex.ru/ нет
клик увёл не туда URL поисковой выдачи нет

В двух последних случаях мы заявляли переход, которого не было. Это ровно то, от чего уходили: смысл всей затеи — выглядеть как человек потому, что делаем то же, что человек, а не потому, что говорим об этом в заголовке.

Почему фиктивная ветка вообще срабатывала

Ссылки в выдаче Яндекса открываются в новой вкладке (target="_blank"). После клика исходная страница остаётся на Яндексе, проверка хоста не проходит — и вместо того, чтобы взять настоящую новую вкладку, код уходил в подстановку заголовка. То есть в типичном случае переход был настоящим, но мы его теряли и заменяли выдумкой.

Что сделано

Новая вкладка перехватывается. Снимок context.pages до клика, сравнение после. Попап на нужном хосте становится якорной страницей; _apply_resource_block применяется именно к ней (по наследству он не передаётся), вкладка с Яндексом закрывается. Это настоящий переход, а не рассказ о нём.

Из-за этого _navigate_anchor_via_search больше не возвращает bool — она отдаёт страницу, на которой origin реально открыт, либо None.

Оба фиктивных фолбэка выброшены. Ссылки нет, клик увёл не туда, попап на чужом хосте, капча, упавшая навигация → None, и вызывающий идёт на origin обычным goto без Referer, ровно как до #3258.

Принцип записан комментарием в коде и на месте удалённой константы _YANDEX_REFERER — он неочевиден, и его легко «оптимизировать» обратно:

либо переход был настоящим, либо об источнике молчим

Тесты

198 passed против 196. Новые: попап на нужном хосте становится якорем, оригинал закрыт, resource-block применён к попапу; попап на чужом хосте → фолбэк без Referer, попап закрыт. Тест «ссылки нет в выдаче» переписан — теперь требует отсутствия Referer вместо yandex.ru/; смена поведения намеренная.

Отдельно проверил, что использованный API есть в установленной версии: Page.wait_for_load_state, BrowserContext.pages, BrowserContext.expect_page — все на месте. ruff check чист.

Что проверить после деплоя

Моки не эквивалент живому Яндексу. По логу будет видно, какая ветка срабатывает в реальности — у каждой своя строка: клик в текущей вкладке / клик открыл новую вкладку / ссылки нет / капча / сбой навигации. Если преобладает «ссылки нет», надо править поисковый запрос (BROWSER_ANCHOR_SEARCH_QUERY_DOMCLICK), а не механику.

Связано

#3258 (заход через поиск), #3250 (Referer на карточку), #3244 (якорная вкладка), #3251 (те же проверки для остальных площадок).

## Что не так с #3258 Та правка научила якорную вкладку заходить на выдачу через поиск Яндекса, но **две ветки из трёх подставляли `Referer`, которого мы не заработали**: | ветка | ставила Referer | переход был? | |---|---|---| | клик по результату удался | URL выдачи Яндекса | да | | ссылку в выдаче не нашли | `https://yandex.ru/` | **нет** | | клик увёл не туда | URL поисковой выдачи | **нет** | В двух последних случаях мы заявляли переход, которого не было. Это ровно то, от чего уходили: смысл всей затеи — выглядеть как человек **потому, что делаем то же, что человек**, а не потому, что говорим об этом в заголовке. ## Почему фиктивная ветка вообще срабатывала Ссылки в выдаче Яндекса открываются в **новой вкладке** (`target="_blank"`). После клика исходная страница остаётся на Яндексе, проверка хоста не проходит — и вместо того, чтобы взять настоящую новую вкладку, код уходил в подстановку заголовка. То есть в типичном случае переход был настоящим, но мы его теряли и заменяли выдумкой. ## Что сделано **Новая вкладка перехватывается.** Снимок `context.pages` до клика, сравнение после. Попап на нужном хосте становится **якорной страницей**; `_apply_resource_block` применяется именно к ней (по наследству он не передаётся), вкладка с Яндексом закрывается. Это настоящий переход, а не рассказ о нём. Из-за этого `_navigate_anchor_via_search` больше не возвращает `bool` — она отдаёт страницу, на которой origin реально открыт, либо `None`. **Оба фиктивных фолбэка выброшены.** Ссылки нет, клик увёл не туда, попап на чужом хосте, капча, упавшая навигация → `None`, и вызывающий идёт на origin обычным `goto` **без `Referer`**, ровно как до #3258. Принцип записан комментарием в коде и на месте удалённой константы `_YANDEX_REFERER` — он неочевиден, и его легко «оптимизировать» обратно: > либо переход был настоящим, либо об источнике молчим ## Тесты **198 passed** против 196. Новые: попап на нужном хосте становится якорем, оригинал закрыт, resource-block применён к попапу; попап на чужом хосте → фолбэк без `Referer`, попап закрыт. Тест «ссылки нет в выдаче» **переписан** — теперь требует отсутствия `Referer` вместо `yandex.ru/`; смена поведения намеренная. Отдельно проверил, что использованный API есть в установленной версии: `Page.wait_for_load_state`, `BrowserContext.pages`, `BrowserContext.expect_page` — все на месте. `ruff check` чист. ## Что проверить после деплоя Моки не эквивалент живому Яндексу. По логу будет видно, какая ветка срабатывает в реальности — у каждой своя строка: клик в текущей вкладке / клик открыл новую вкладку / ссылки нет / капча / сбой навигации. Если преобладает «ссылки нет», надо править поисковый запрос (`BROWSER_ANCHOR_SEARCH_QUERY_DOMCLICK`), а не механику. ## Связано #3258 (заход через поиск), #3250 (Referer на карточку), #3244 (якорная вкладка), #3251 (те же проверки для остальных площадок).
lekss361 added 1 commit 2026-08-29 20:42:29 +00:00
fix(tradein/browser): переход с Яндекса на площадку должен быть настоящим, а не заявленным
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 1m26s
0b97d64864
PR #3258 научил якорную вкладку заходить на выдачу через поиск Яндекса, но две
ветки из трёх подставляли Referer, которого мы не заработали: «ссылку в выдаче не
нашли» ставила https://yandex.ru/, «клик увёл не туда» — URL поисковой выдачи. В
обоих случаях перехода с Яндекса на площадку НЕ БЫЛО, а заголовок утверждал
обратное.

Главная причина, по которой вторая ветка вообще срабатывала: ссылки в выдаче
Яндекса открываются в НОВОЙ вкладке (target="_blank"). Исходная страница остаётся
на Яндексе, проверка хоста не проходит — и вместо того, чтобы взять настоящую
новую вкладку, мы уходили в подстановку заголовка.

Теперь новая вкладка перехватывается: снимок context.pages до клика, сравнение
после; попап на нужном хосте становится ЯКОРНОЙ страницей (resource-block
применяется к ней — по наследству он не передаётся), вкладка с Яндексом
закрывается. Это и есть настоящий переход.

Оба фиктивных фолбэка выброшены. Не нашли ссылку, клик увёл не туда, попап не на
том хосте, капча, упавшая навигация — возвращаем None, и вызывающий идёт на origin
обычным goto БЕЗ Referer, ровно как до #3258. Принцип зафиксирован комментарием в
коде и на месте удалённой константы _YANDEX_REFERER, иначе его легко
«оптимизировать» обратно: либо переход был настоящим, либо об источнике молчим.

Тесты: 198 passed против 196 — попап на нужном хосте становится якорем и оригинал
закрыт; попап на чужом хосте → фолбэк без Referer; тест «ссылки нет» переписан, он
теперь требует отсутствия Referer вместо yandex.ru.
lekss361 merged commit 6cf987c55b into main 2026-08-29 20:44:26 +00:00
lekss361 deleted branch feat/browser-real-search-clickthrough 2026-08-29 20:44:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3260
No description provided.