# Инициализация

> Что происходит между вашим запросом open и открытой вкладкой — и почему первый шаг дороже остальных

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

Эта страница объясняет механику. Читать её, чтобы начать работать, не
обязательно — но когда `open` отвечает `sessions_busy` или занимает пять секунд,
здесь написано, почему.

## Что происходит по шагам

**1. Проверяется ключ и место в пуле**

    Сперва считаются живые сессии. Их потолок — четыре на весь сервис, и если
    все заняты, дальше дело не идёт: приходит `sessions_busy` с кодом 503 и
    заголовком `Retry-After`. Ни браузер, ни профиль на этом шаге ещё не
    трогаются, поэтому отказ приходит быстро и ничего не стоит.

**2. Берётся слот пула — вкладка настоящего Chrome**

    Слот — это запущенный браузер с закреплённым за ним адресом выхода. Он
    берётся из общего пула с меткой `browser` и выходит из него **на всё время
    жизни сессии**: пока вы работаете, запросы Search и Fetch на этот профиль не
    попадут.

    Это и есть главная причина, по которой Browser дороже Fetch. Fetch отдаёт
    слот через секунды, сессия держит его минутами.

**3. Открывается пустая вкладка**

    Сначала `about:blank`, а не ваш адрес. Пустая вкладка нужна, чтобы
    настроить эмуляцию до того, как страница увидит браузер: подменять
    устройство и язык после загрузки поздно — скрипты уже отработали.

    Не удалось открыть вкладку — приходит `browser_busy`, 503.

**4. Применяется эмуляция**

    По параметрам `device`, `gl` и `hl` выставляются размер экрана, User-Agent,
    язык интерфейса и часовой пояс. Адрес выхода уже выбран вместе со слотом и
    соответствует стране из `gl`.

**5. Загружается ваша страница**

    Навигация идёт под таймаутом. Не уложилась или сорвалась — сессия тут же
    закрывается, а вам приходит `navigation_failed` с кодом 502 и текстом самого
    браузера.

**6. Ожидание догрузки**

    После навигации ждём, пока страница успокоится: состояние документа, сетевые
    записи и изменения DOM разом. Итог приходит в поле `settled` — подробно об
    этом в разделе [Догрузка страницы](https://docs.parreq.com/browser-settled).

**7. Сборка ответа**

    Со страницы снимается то, что заказано в `include`: кнопки, поля, текст,
    разметка. Каждому элементу проставляется метка `ref`, по которой вы будете к
    нему обращаться.

    Сорвалась сборка — сессия снова закрывается здесь же. Идентификатора вы ещё
    не получили, закрыть её вам было бы нечем, и до уборщика она держала бы
    профиль и вкладку впустую.

Только после этого в ответе появляется `session_id`. С этого момента вкладка
ваша и ждёт следующего шага.

> **Примечание.**
>   Всё, что описано выше, — один вызов `open`. Отдельной ручки «инициализировать»
>   нет намеренно: сессия без открытой страницы бесполезна, а держать её в таком
>   виде значило бы занимать слот пула ни за чем.

## Чем следующие шаги отличаются от первого

`click` и `fill` не заводят ничего заново: слот, профиль, адрес выхода и куки
уже на месте. Шаг — это действие, ожидание догрузки и новая сборка списка
элементов. Поэтому он и стоит в три раза дешевле `open`.

| | `open` | `click` и `fill` |
|---|---|---|
| Берёт слот пула | да | нет, уже взят |
| Настраивает эмуляцию | да | нет |
| Ждёт догрузки | да | да |
| Пересобирает `elements` | да | да |
| Кредитов | 3 | 1 |

## Что живёт между вызовами

**Куки и хранилище**
    Всё, что сайт записал за время сессии, остаётся до её закрытия.

**История вкладки**
    Переходы копятся в той же вкладке — сайт видит обычное поведение, а не
    серию заходов с нуля.

**Адрес выхода**
    Один и тот же на всю сессию. Смена IP посреди формы — верный способ
    получить проверку.

**Профиль браузера**
    Отпечаток не меняется между шагами: тот же экран, тот же язык, те же
    шрифты.

## Сколько это занимает

`open` — это навигация плюс ожидание догрузки, то есть обычно **2–8 секунд** и
дольше на тяжёлых страницах. `click` и `fill` быстрее: навигации в них может не
быть вовсе.

Ставьте клиентский таймаут не меньше 180 секунд. Библиотеки для Python и Node
делают это сами.

> **Внимание.**
>   Заводить сессию «про запас» не нужно. Пока она открыта, слот пула занят, а
>   простой в 60 секунд закроет её раньше, чем вы успеете ей воспользоваться.
