Назад в Центр знаний
Отпечатки

Эмуляция активного окна и состояние видимости

Сравните focus, blur, visibilityState и document.hidden в headless и headful сессиях BotBrowser, не выдавая активность за присутствие человека.

BotBrowser Team

Документация

Нужна структурированная документация по теме Отпечатки?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

BotBrowser может удерживать объявленный контекст в активном состоянии, включая document.visibilityState === "visible" и document.hidden === false, когда включён --bot-always-active. Это уже, чем окно рабочего стола на переднем плане, человек, идентичность или гарантия физического фокуса. Документация активного окна описывает флаг и значение по умолчанию; здесь добавлены различия между focus и Page Visibility, headless/headful fixture и минимизированное доказательство. Смотрите также основы браузерного fingerprinting.

TL;DR

  • focus и blur описывают переходы фокуса; visibilitychange, document.visibilityState и document.hidden описывают видимость документа.
  • --bot-always-active сохраняет защищённые активные шаблоны в BotBrowser PRO и выше, но active не означает человека, уникальность, доверие или гарантированный передний план.
  • Сравнивайте headless и headful с одним профилем, страницей и fixture. Записывайте состояние, счётчики и ограниченный результат, а не содержимое и идентификаторы.
  • Обычный браузер может показать hidden для фоновой вкладки, свернутого окна или невидимого документа. Порядок событий зависит от браузера и платформы.
  • Если флаг отсутствует или отключён, принимайте обычный результат браузера и сохраняйте резервный путь продукта; не создавайте ложное утверждение о присутствии человека.

Contents

Нейтральная схема разделяет фокус и видимость в headless, headful и вкладке без фокуса и ведёт к ограниченной записи приватности

Фокус и Page Visibility: разные вещи

Спецификация W3C Page Visibility 2 определяет модель видимости и событие visibilitychange. Она отвечает, виден ли документ браузеру, но не говорит, смотрит ли человек на экран, получает ли окно клавиатуру или включён ли монитор. Руководство MDN Page Visibility API описывает фоновые вкладки и свернутые окна как события жизненного цикла.

focus и blur относятся к другому уровню. Фокус окна определяет получателя ввода, а фокус элемента задаёт контрол клавиатуры. Окно может потерять фокус без скрытия документа, а видимый документ может не иметь сфокусированного элемента. Любое событие является наблюдением, а не доказательством внимания, личности или разрешения.

Для сравнения отображения используйте этот fixture вместе с политикой device pixel ratio и свойствами экрана и viewport; те страницы описывают геометрию, а здесь описан жизненный цикл.

СигналЗначение браузераНе доказано
focus / blurОкно или элемент изменил фокусВнимание человека, identity или physical foreground
visibilitychangeИзменилось состояние видимости документаПитание монитора, намерение пользователя или чтение
document.visibilityStateТекущее состояние документа, например visible или hiddenУниверсальное состояние платформы во всех браузерах
document.hiddenБулево представление видимости документаПрисутствие человека или доверие

Это дополняет документацию активного окна: там описана настройка, здесь описаны смысл наблюдений и воспроизводимая проверка.

Что меняет эмуляция активного окна

При --bot-always-active BotBrowser сохраняет защищённое активное поведение, даже если окно хоста потеряло фокус. Документация указывает значение по умолчанию для PRO и работу в headless и headful. Это поведение авторизованного контекста, а не сведения о человеке или рабочем столе.

Страница может увидеть visibilityState как visible, hidden как false и отсутствие перехода видимости при потере фокуса хостом. События фокуса имеют собственный порядок. Поэтому fixture должен записывать прочитанные значения. Флаг не добавляет отсутствующий API, не исправляет приложение и не гарантирует физическое окно впереди. Справочник Document.visibilityState описывает снимок, а visibilitychange сообщает об изменении.

Построить fixture трёх режимов

Используйте страницу одного источника и три объявленных режима: headless с эмуляцией, headful с эмуляцией и headful-вкладка без фокуса с выключенным флагом. Профиль, версию и ревизию страницы оставляйте одинаковыми. Скрипт сохраняет только ограниченные наблюдения.

const result = {
  fixtureId: 'visibility-boundary-01',
  flag: 'unknown',
  visibilityState: document.visibilityState,
  hidden: document.hidden,
  focusEvents: 0,
  blurEvents: 0,
  visibilityChanges: 0,
  outcome: 'initial',
};

window.addEventListener(
  'focus',
  () => {
    result.focusEvents += 1;
  },
  { passive: true }
);
window.addEventListener(
  'blur',
  () => {
    result.blurEvents += 1;
  },
  { passive: true }
);
document.addEventListener('visibilitychange', () => {
  result.visibilityChanges += 1;
  result.visibilityState = document.visibilityState;
  result.hidden = document.hidden;
});

window.sampleVisibility = flag => ({
  ...result,
  flag,
  visibilityState: document.visibilityState,
  hidden: document.hidden,
  outcome: 'sampled',
});
РежимFlagДействие хостаФорма записи
HeadlessenabledНет окна рабочего столаvisible, false, ограниченные события
HeadfulenabledУбрать фокус с окна хостаvisible, false, ограниченные события
HeadfuldisabledПерейти на другую вкладкуhidden или visible по контексту браузера

Последняя строка намеренно условна: если runner не умеет убрать фокус, запишите action-unavailable, а не выдумывайте hidden. BotBrowser может воспроизвести авторизованный fixture и получить JSON, но результат относится только к контексту и профилю. Для отдельного рассмотрения жизненного цикла используйте устойчивость долгих контекстов.

Читать visibilityState и document.hidden

Читайте document.visibilityState внутри visibilitychange; document.hidden является его булевой формой. Не используйте значение, сохранённое при загрузке, для решения о возобновлении. Владелец задачи должен не позволять видимому состоянию воскресить завершённую задачу.

let taskActive = false;

function readVisibility() {
  return {
    state: document.visibilityState,
    hidden: document.hidden,
  };
}

document.addEventListener('visibilitychange', () => {
  const current = readVisibility();
  if (current.hidden) pauseOwnedTask();
  else if (taskActive) resumeOwnedTask();
});

Это пример владения задачей, а не универсальная политика. Проигрыватель может следовать настройке пользователя, а редактор обязан сохранить локальные данные. Счётчики focusEvents, blurEvents и visibilityChanges храните раздельно.

Headless, headful и вкладка без фокуса

Headless и headful являются режимами выполнения, а не состояниями присутствия. Headful-окно может быть закрыто другим окном или свернуто, а вкладка без фокуса в некоторых макетах остаётся видимой. Запускайте один профиль и фиксируйте режим, действие хоста, значение и результат. visible не доказывает, что кто-то смотрит; hidden не говорит, кто сменил вкладку.

Руководство Page Visibility API связывает видимость с таймерами и фоновой работой. Не превращайте разницу времени в классификатор личности. Проверяйте результат и очистку приложения, а не предполагаемые «человеческие» миллисекунды.

Осознанно использовать флаг и резервный путь

--bot-always-active=false является контрольным запуском обычной видимости. До интерпретации различий проверьте entitlement, фактические аргументы и профиль. Поля flagRequested, flagEffective и fallback записывайте отдельно. BotBrowser может воспроизвести авторизованный fixture и наблюдать результат, но не может доказать присутствие человека или состояние физического окна. При отсутствии флага браузер должен сам управлять событиями, а интерфейс должен сохранять паузу, сохранение и повтор.

Справочник расширенных возможностей описывает защищённые шаблоны. Это функция согласованности авторизованного контекста, а не обещание переднего плана или непрерывной идентичности.

Минимизировать доказательства и заявления о приватности

Оставляйте короткую запись и удаляйте неограниченные трассы:

{
  "fixtureId": "visibility-boundary-01",
  "browserMode": "headful",
  "flagEffective": true,
  "visibilityState": "visible",
  "hidden": false,
  "focusEvents": 1,
  "blurEvents": 1,
  "visibilityChanges": 0,
  "outcome": "stable-visible"
}

Версия, система, ревизия профиля и дата могут находиться в метаданных теста. Не сохраняйте аккаунты, приватные пути, DOM-текст, нажатия клавиш и межсайтовые идентификаторы. Active не значит человек, active не значит identity и active не гарантирует foreground. Правила ответственного использования BotBrowser определяют авторизацию и хранение.

Диагностировать первое расхождение

Начните с конфигурации: при flagEffective: false проверьте лицензию, аргумент и профиль. Если флаг эффективен, но изменился visibilityState, сравните режим и действие хоста. Если вырос blurEvents без visibilityChanges, был только переход фокуса. При переходе видимости читайте состояние внутри обработчика и не возобновляйте завершённую задачу.

Передача для проверки должна содержать fixtureId, режим, эффективный флаг, первое различное поле, ожидаемую и фактическую ветви и следующий шаг. Не добавляйте учетные данные, чтобы тест выглядел реалистично.

Public sources

Practical conclusion

Считайте эмуляцию активного окна ограниченным контролем согласованности. Используйте visibilitychange, document.visibilityState и document.hidden для жизненного цикла документа, а focus и blur держите в отдельном слое. Сравнивайте три режима, проверяйте --bot-always-active=false, минимизируйте доказательства и помните: active не доказывает человека, identity, согласие или гарантированный foreground.

#Эмуляция Активного Окна#Page Visibility API#visibilityState#Document.hidden#Приватность

Эта статья входит в руководство: Что такое отпечаток браузера?

Переведите BotBrowser из исследований в продакшн

Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.