Вы нажали F12, и страница побелела. Или вас выкинуло на главную, или она зависла с баннером «Paused in debugger», или написала «developer tools detected» и перестала грузиться. В любом случае сайт заметил, хотя никакого события об этом не было.
Скрипты страницы не получают сигнала, когда вы открываете DevTools, выбираете элемент или читаете панель. Зато они могут заметить, что открытый DevTools делает со страницей. Виджет на этой странице запускает такие проверки в вашем браузере, так что откройте DevTools прямо сейчас и посмотрите, как он отреагирует.
debugger останавливает страницу, пока часы продолжают идти. Из этих трёх у двух есть дешёвый обход (открепить панель, отключить точки останова). У замера времени консоли обхода нет, и срабатывает в том числе на Puppeteer. Ничто из этого не идентифицирует человека, а проверки в виджете выполняются целиком в вашем браузере.Видит ли сайт, что вы пользуетесь Inspect Element?
Через свои скрипты нет. Браузеры не генерируют события «DevTools открыт», а выбор элемента или чтение панели странице ничего не сообщают. Сервер при этом по-прежнему видит обычные запросы. Просмотр исходного кода — это обычный запрос страницы или чтение из вашего кэша, а Chrome при открытии DevTools подгружает source maps сайта, так что сервер, который их отдаёт, может это записать. Какой элемент вы выбрали и какую панель читали, он не узнает никогда.
Правка страницы в Inspect Element никак не влияет на остальных. Вы меняете копию, которая лежит в вашей вкладке, копия на сервере остаётся нетронутой, а после перезагрузки возвращается оригинал. Страница при этом может заметить, что один из её элементов изменился, потому что MutationObserver сообщает о таких правках как об обычных изменениях DOM. Я проверил это для правок текста и атрибутов в Chrome, и запись ничего не говорит о том, кто внёс изменение. Попробуйте на цене в виджете: кликните по ней правой кнопкой, выберите «Просмотреть код» и отредактируйте текст. На схеме видно, куда попадает изменение.
Как страница узнаёт, что DevTools открыт
Три приёма работают по одному принципу. Страница не может спросить «DevTools открыт?», поэтому она ставит замер и следит за побочным эффектом. Идея та же, что в детекте блокировщиков рекламы: страница не видит сам инструмент, поэтому измеряет, что он меняет.
Разница размеров окна. Закреплённый сбоку или снизу DevTools забирает место у страницы, и window.outerWidth - window.innerWidth (или то же для высоты) скачет. Скрипты считают признаком разницу от 160–170 пикселей и больше. На моём компьютере с Windows 11 закрепление DevTools справа сдвинуло разницу по ширине с 14 до 569 пикселей, а когда я открепил панель, разница вернулась к 14. Срабатывает она и ошибочно: при масштабировании страницы или открытой боковой панели браузера. Самая известная библиотека для этого, devtools-detect, была заархивирована в мае 2026 года, а в её README прямо признаётся, что метод даёт много ложных срабатываний.
Цена консоли. Классический трюк логирует объект с геттером и ждёт, прочитает ли его консоль. Многие старые ответы всё ещё описывают его, но в актуальном Chrome он больше не срабатывает: в моём тесте на Chrome 155 для Windows геттер на Error.stack и геттер на id элемента молчали при открытом DevTools. Другие варианты, например собственный toString, срабатывают независимо от того, открыт DevTools или нет, так что ничего не доказывают.
Зато видно время. Логирование почти бесплатно, пока не подключён клиент консоли, а потом Chrome должен строить превью каждого объекта. Сорок вызовов console.debug с объектом на 40 ключей занимали меньше миллисекунды при закрытом DevTools и несколько миллисекунд при открытом, то есть примерно десятикратный скачок на моей машине. Не имело значения, закреплена панель или вынесена в отдельное окно. Тот же скачок появился и при голой сессии Chrome DevTools Protocol, которую Puppeteer и Playwright открывают по умолчанию. Страница, которая сравнивает время собственного логирования с базовым уровнем, это заметит. Отличить разработчика от скрипта она при этом не может, и именно поэтому детект ботов этим пользуется. Firefox и Safari я не проверял.
Оператор debugger. Без DevTools он ничего не делает. С открытым DevTools и включёнными точками останова он останавливает страницу, пока вы не нажмёте Resume. Скрипт читает часы до и после, и разрыв больше примерно 100 мс считается паузой. Скрипты трактуют это как «кто-то смотрит», хотя вкладка в режиме энергосбережения или медленная машина могут подделать такой разрыв. Это же и баннер «Paused in debugger». Кнопка в виджете запускает его один раз, чтобы вы почувствовали.
Наблюдатель за правками. Четвёртый сигнал вообще не проверка DevTools. Это тот самый MutationObserver из раздела выше, направленный на то, что скрипт хочет защитить, например на цену или элемент с платным доступом. Он сообщает об изменении, а не о DevTools.
- замеченоРазница размеров окнаВнешнее окно минус область страницы
- замеченоЦена консолиЗамер 40 вызовов консоли против базового уровня
- замеченоЗамер паузы debuggerОператор debugger и секундомер
Почему сайт зависает, редиректит или пишет «developer tools detected»
Сайты, которые реагируют, пользуются не одним приёмом. Кристиан Хайльманн разобрал один такой в статье Cracking a “Developer Tools Killer” script. Скрипт блокирует правую кнопку мыши и сочетания F12, Ctrl+Shift+I и Ctrl+U, затем каждые 100 мс гоняет цикл с debugger и перенаправляет страницу, если пауза длится дольше 200 мс. Его функция проверки не обёрнута в замыкание, так что Хайльманн просто переписал её.
Мотив обычно один: усложнить копирование и скрапинг. Ничего это не защищает, потому что всё, что отправляет сервер, уже находится в вашем браузере. Копирование, вставка, переключение вкладок и скриншоты относятся к отдельному набору сигналов, о которых написано в статье видит ли сайт переключение вкладок, копирование и скриншоты.
Может ли сайт заблокировать Inspect Element или F12?
Страница может отменять события клавиш F12 и Ctrl+Shift+I и контекстное меню, и большинство «блокирующих» скриптов делают именно это. Это косметика. Меню браузера (Дополнительные инструменты, Инструменты разработчика) работает вне страницы, и остановить его нельзя. Последняя строка виджета записывает, какие из этих событий доходят до страницы в вашем браузере. Он только наблюдает и ничего не отменяет.
Как обойти детект DevTools и убрать зависание
DevTools — штатная функция браузера, так что проверка, которая на него срабатывает, это проблема сайта. Подбирайте обход под конкретную проверку:
- Отключите точки останова на панели «Источники» (Sources) (Ctrl+F8, на Mac Cmd+F8). Каждый оператор
debuggerпревращается в пустую операцию, и проверка паузы не видит разрыва. - Открепите панель в отдельное окно, и разница размеров окна перестанет работать.
- Разберитесь со скриптом, если срабатывает замер консоли. Настройки, которая скрывала бы консоль от страницы, не существует. Можно переопределить или заблокировать скрипт детекта, как это делает разбор Хайльманна, переписывая его функцию проверки, либо изучить сохранённую копию страницы, в которой не выполняется никаких скриптов.
Не ставьте расширение, которое подделывает window.outerWidth или патчит console. Подменённая встроенная функция перестаёт сообщать [native code], и это само по себе выдаёт её, как и пропатченные нативные функции в детекте ботов.
Законно ли пользоваться Inspect Element?
Да. Он есть в каждом крупном браузере, описан в документации и правит только вашу локальную копию. Проблемы начинаются с того, что вы делаете дальше: подправленный скриншот, выданный за настоящий чек, счёт или банковскую выписку, может считаться подделкой документов или мошенничеством, в зависимости от того, где вы живёте и чего добиваетесь, каким бы инструментом он ни был сделан.
Если вы запускаете много браузеров
Для разработчика срабатывание означает сломанную страницу, пока он не отключит точки останова. Для того, кто запускает браузеры массово, оно означает флаг на каждом сайте, который замеряет время консоли, потому что время вызовов консоли меняется, когда подключается канал автоматизации, а не только когда человек открывает DevTools. Если вы управляете профилями через Puppeteer или Playwright, прогоняйте каждую связку через виджет выше, без открытого окна DevTools, прежде чем на неё полагаться.
Профили Incogniton — это настоящие сборки Chromium, так что описанные проверки применимы к ним так же, как к Chrome. Будет ли замер консоли молчать, зависит от того, как вы управляете профилем, так что проверьте эту часть сами. Разрешена ли конкретному сайту автоматизация, определяют его собственные правила, поэтому сначала прочитайте их.
Попробуйте прямо сейчас: откройте DevTools при работающем виджете, затем открепите панель и отключите точки останова. Две строки затихнут. А вот строка консоли не затихнет. Полное сканирование браузера охватывает всё остальное, что может прочитать страница, от сети до отпечатка.