Хороший обзор. По уровню 5-6 хочу добавить момент, который обычно всплывает позже: когда агент начинает реально ходить по продакшн-сайтам, headless-браузер довольно быстро детектится. Сайт отдаёт другой контент, показывает капчу или тихо блокирует сессию. Агент при этом формально "завершает задачу", но работает не с теми данными. Для внутренних инструментов это не проблема. Но как только агент взаимодействует с внешними сервисами - это реально больная точка, которую в уровнях не упоминают.
Transaction-мониторинг интересная идея, но на практике есть один нюанс, который легко упустить: headless Playwright из коробки имеет характерный fingerprint, и многие сайты его обнаруживают. В результате сценарий «проходит», страница открывается, форма видна, но сайт отдаёт другой контент, показывает капчу или просто блокирует сессию. Монитор видит 200 OK, а реальный пользователь в это время видит стену с капчей. Особенно актуально для e-commerce и SaaS, где Cloudflare и аналоги стоят почти везде. Для таких случаев стоит запускать Playwright через браузер с патченным fingerprint - иначе результаты transaction-проверок будут ненадёжными именно на тех сайтах, где мониторинг важнее всего.
Хочу добавить кое-что про L2, что часто упускают: navigator.hardwareConcurrency и deviceMemory это не просто статические числа, которые нужно подменить. Проблема в том, что эти значения коррелируют с другими сигналами. Если вы говорите "16 ядер, 32GB RAM", но при этом WebGL renderer показывает llvmpipe или Mesa, или AudioContext показывает нулевые задержки без джиттера, вся легенда рассыпается. Современные системы детекции, в частности Akamai и DataDome, строят граф корреляций. Один параметр сам по себе не срабатывает, но несовпадение двух-трёх уже достаточно. Про deterministic noise в Canvas - хорошо, что упомянули. Именно этот момент часто ломает дешёвые stealth-решения: рандом на каждый вызов toDataURL() легко детектируется повторным рендером. Детерминизм привязанный к pid, это правильный подход.
По поводу локальных агентов - причина, почему агент «теряется», часто не в локаторах. Headless Chromium в автоматическом режиме ведёт себя иначе, чем реальный браузер, и сайты это замечают: отдают другой контент, блокируют сессию, показывают капчу. Агент видит совсем не то, что видит человек. Для exploratory testing на реальных сайтах это первое, что стоит проверить при настройке окружения.
Хороший обзор. По уровню 5-6 хочу добавить момент, который обычно всплывает позже: когда агент начинает реально ходить по продакшн-сайтам, headless-браузер довольно быстро детектится. Сайт отдаёт другой контент, показывает капчу или тихо блокирует сессию. Агент при этом формально "завершает задачу", но работает не с теми данными.
Для внутренних инструментов это не проблема. Но как только агент взаимодействует с внешними сервисами - это реально больная точка, которую в уровнях не упоминают.
Transaction-мониторинг интересная идея, но на практике есть один нюанс, который легко упустить: headless Playwright из коробки имеет характерный fingerprint, и многие сайты его обнаруживают. В результате сценарий «проходит», страница открывается, форма видна, но сайт отдаёт другой контент, показывает капчу или просто блокирует сессию. Монитор видит 200 OK, а реальный пользователь в это время видит стену с капчей.
Особенно актуально для e-commerce и SaaS, где Cloudflare и аналоги стоят почти везде. Для таких случаев стоит запускать Playwright через браузер с патченным fingerprint - иначе результаты transaction-проверок будут ненадёжными именно на тех сайтах, где мониторинг важнее всего.
Хочу добавить кое-что про L2, что часто упускают: navigator.hardwareConcurrency и deviceMemory это не просто статические числа, которые нужно подменить. Проблема в том, что эти значения коррелируют с другими сигналами. Если вы говорите "16 ядер, 32GB RAM", но при этом WebGL renderer показывает llvmpipe или Mesa, или AudioContext показывает нулевые задержки без джиттера, вся легенда рассыпается. Современные системы детекции, в частности Akamai и DataDome, строят граф корреляций. Один параметр сам по себе не срабатывает, но несовпадение двух-трёх уже достаточно.
Про deterministic noise в Canvas - хорошо, что упомянули. Именно этот момент часто ломает дешёвые stealth-решения: рандом на каждый вызов toDataURL() легко детектируется повторным рендером. Детерминизм привязанный к pid, это правильный подход.
По поводу локальных агентов - причина, почему агент «теряется», часто не в локаторах. Headless Chromium в автоматическом режиме ведёт себя иначе, чем реальный браузер, и сайты это замечают: отдают другой контент, блокируют сессию, показывают капчу. Агент видит совсем не то, что видит человек.
Для exploratory testing на реальных сайтах это первое, что стоит проверить при настройке окружения.