# Ошибки Browser API

> Коды отказов, что каждый значит и какие повторяются сами

Источник: https://docs.parreq.com/browser-errors/

Все ошибки приходят в общем формате [раздела об ошибках](https://docs.parreq.com/errors): код, текст и
признак `retryable`.

## Коды

| Код | HTTP | Когда | Что делать |
|---|---|---|---|
| `session_not_found` | 410 | Сессии нет: истёк простой либо потолок | Открыть новую |
| `session_expired` | 410 | Сессия была, но закрылась к моменту запроса | Открыть новую |
| `element_not_found` | 404 | Элемент исчез после перерисовки | Взять свежий `elements` и повторить |
| `element_disabled` | 409 | Элемент на странице отключён | Заполнить то, чего ждёт форма |
| `sessions_busy` | 503 | Все сессии заняты | Повторить по `Retry-After` |
| `browser_busy` | 503 | Не удалось открыть вкладку | Повторить через несколько секунд |
| `navigation_failed` | 502 | Страница не открылась | Проверить адрес, повторить |
| `page_error` | 502 | Страница не ответила на сборку | Повторить; в тексте — что сказал браузер |
| `tab_gone` | — | Вкладка закрылась под нами | Сессия мертва, открыть новую |
| `no_egress` | 503 | Нет свободного адреса выхода | Повторить позже |
| `invalid_request` | 400 | Адрес не начинается с `http://` или `https://` | Починить запрос |

> **Примечание.**
>   `invalid_request` приходит до похода в браузер и **не списывает кредитов**.
>   Так же ведут себя отказы по правам и по балансу: платить за отказ нечестно, а
>   тратить на него Chrome — глупо.

## Что чинится само, а что доходит до вас

Переход прямо во время сборки мы переживаем сами: согласие на куки, определение
города, уход на `www`, смена маршрута в одностраничном приложении. Сборка
повторяется в новом документе, и до вас такой отказ не доходит вовсе.

Доходит то, что повтором внутри шага не лечится. В таком случае в сообщении
стоит **текст самого браузера**, а не название внутреннего исключения: по нему
видно, чинить обращение или просто повторить.

## Разбор частых случаев

### element_not_found на кнопке, которая точно есть

    Метки живут в пределах шага. Если между получением списка и нажатием
    страница перерисовалась, прежний `ref` уже ничего не значит.

    Берите список из последнего ответа и ищите элемент по подписи `text` или по
    `name`, а не по позиции в массиве.

### session_not_found через несколько секунд после open

    Простой — 60 секунд. Если между вызовами стоит обращение к модели или
    ожидание пользователя, сессия успевает закрыться.

    Готовьте решение о следующем шаге заранее либо открывайте сессию
    непосредственно перед действием.

### sessions_busy сразу после собственной работы

    Ваша прошлая сессия ещё жива: без явного `close` она держит место до десяти
    секунд простоя.

    Закрывайте сессии в `finally` — см. [close](https://docs.parreq.com/browser-close).

### element_disabled на кнопке отправки

    Форма ждёт обязательных полей. Посмотрите в списке элементов те, у которых
    `required: true` и пустой `value`.

### page_error повторяется на одной и той же странице

    Значит, дело не в случайности. В тексте ошибки стоит ответ браузера — по
    нему обычно видно, что страница требует чего-то, чего в сессии нет:
    авторизации, согласия, поддерживаемого устройства.

    Попробуйте другой `device` или `gl`.
