Undetected ChromeDriver: альтернативы на уровне браузера
Сравните undetected-chromedriver и настройку на уровне браузера по владельцу изменения, поверхности обновления и границам доказательств.
BotBrowser Team
Нужна структурированная документация по теме Начало работы?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Термин «браузер без обнаружения» описывает результат, который приписывает детектор, а не устойчивое свойство бинарного файла. Публичный проект undetected-chromedriver описывает себя как изменённый ChromeDriver, тогда как профиль на уровне браузера является другим способом передать настройки. У этих подходов разные владельцы, поверхности обновления и требования к доказательствам. Сначала определите, какой слой меняет значение, затем измеряйте только контролируемую авторизованную страницу. BotBrowser документирует настройки профиля и границы согласованности автоматизации; он не изменяет undetected-chromedriver, не поддерживает цикл его релизов и не обещает решение сайта или детектора.
Кратко
- README
undetected-chromedriverописывает автоматическую загрузку и изменение драйвера. Это описание проекта, а не независимая проверка каждой версии и цели. - Пакет, WebDriver и ядро браузера принадлежат разным слоям. Изменение одного слоя не доказывает изменение другого или принятие сессии сайтом.
- Записывайте версии пакета и браузера, запрошенные параметры, возвращённые capabilities, источник fixture, наблюдаемую API и сравнение с ожиданием. Примерный JSON так и помечайте.
- Используйте собственную или явно разрешённую fixture. Текст не описывает обход детектора или взаимодействие с чужим challenge.
navigator.webdriverпоказывает свойство конкретной сессии, но не доказывает личность, разрешение или решение детектора.
Содержание
- Что описывает проект
- У трёх слоёв разные владельцы
- Версии создают разную работу по сопровождению
- Измерение собственной fixture без вердикта
- Чтение записи по отказавшему слою
- Место настройки браузера
- Практический вывод
Что описывает проект
README репозитория представляет undetected-chromedriver как проект изменения ChromeDriver. В нём сказано, что пакет автоматически загружает и изменяет бинарный файл драйвера; пример создаёт Python-драйвер с headless=True и use_subprocess=False. Это позволяет описать опубликованное поведение и вызов примера. Это не матрица текущей совместимости, не доказательство исполнения каждого изменения и не прогноз решения другого сайта.
README также содержит сильные формулировки о сервисах anti-bot. Можно точно сказать, что такая фраза есть в README, но она не является универсальным измерением: не указаны все версии сервиса, сборки браузера, аккаунты, сети, профили и даты. Здесь такие сервисы не тестируются, поэтому фраза не считается результатом. Результат детектора зависит от его конфигурации и условий проверки.
Страница проекта и установленный пакет относятся к разным моментам. Ветка репозитория может измениться после установки версии. Поэтому версия Python-пакета, исходный commit, загруженный драйвер, версия Chrome и параметры сессии должны храниться раздельно. Одного имени пакета недостаточно для воспроизведения конфигурации или объяснения отказа.
Selenium отдельно описывает интеграцию ChromeDriver, параметры браузера и ответ сайта. Документация Chrome объясняет интеграцию драйвера, а общая документация WebDriver - создание сессии и capabilities. Эти источники поддерживают различие между запрошенной настройкой и результатом переговоров сессии. Они не подтверждают стороннее изменение и не определяют политику удалённого сайта.
MDN описывает navigator.webdriver как доступное только для чтения свойство, показывающее управление пользовательским агентом автоматизацией. Это один сигнал API браузера, а не идентичность, разрешение или полный список данных удалённого сервиса. Страница может сообщить значение, но из него одного нельзя восстановить всю реализацию пакета.
Источник и наблюдение должны оставаться разделёнными. Исходный код показывает наличие ветки, но не доказывает её выполнение в данном процессе. Собственная fixture показывает, что она прочитала, но не показывает, что другой сайт прочитал те же поля или придал им тот же смысл. Для каждого вывода сохраняйте источник и условия измерения.
У трёх слоёв разные владельцы
«Изменение браузера» слишком общее выражение. Сравнивайте JavaScript страницы, код WebDriver или пакета драйвера и поведение ядра браузера. Каждый слой имеет собственные входы и цикл обновления; перечень сигналов, которые читает детектор и справочник интеграции профиля Selenium рассматривают соседние поверхности браузера.
| Слой | Обычный владелец | Что подтверждает артефакт | Поверхность обновления | Чего он не подтверждает сам |
|---|---|---|---|---|
| Скрипт страницы | Приложение или injected script | Загруженный код и API, которые он пытался обернуть | Bundle сайта, расширение, preload и порядок выполнения | Изменение native-поведения или удалённый вердикт |
| Драйвер или пакет | WebDriver и его пакет | Запрошенные параметры, код драйвера, возможно версию бинарника | Релиз пакета, загрузка драйвера, совместимость Selenium и браузера | Изменение значения ядра или принятие сессии сайтом |
| Ядро браузера | Сборка и поддерживаемая конфигурация | Значения и поведение браузера в условиях запуска | Релиз браузера, флаги, профиль и платформа | Одинаковое чтение каждой страницей или общий смысл |
Page wrapper работает в JavaScript-контексте. Он может менять чтения затронутых объектов, но у страницы остаются другие контексты, native-пути и значения браузера. Проверяйте их только на ограниченной авторизованной fixture. Список API в файле изменения не доказывает изменение каждого потребителя.
Пакет драйвера создаёт сессию и управляет своими артефактами. Объект Selenium параметрs описывает запрос при создании сессии, а возвращённые capabilities - результат переговоров. Это разные доказательства. Полный набор видимых странице значений требует измерения в заданной сборке и конфигурации.
Профиль может передавать поддерживаемые значения при запуске браузера, а не заменять API скриптом после загрузки документа. Это говорит о месте настройки, но не обещает поддержку каждой свойства, одинаковое поведение платформ или принятие детектором. Поля профиля определяются документацией продукта; слово «профиль» не заменяет доказательство загрузки.
Все три слоя могут работать одновременно. Записывайте requestedOptions как запрос WebDriver, returnedCapabilities как результат сессии, профильInput как вход запуска и pageReads как данные fixture. Одна метка вроде «без обнаружения» скрывает необходимые границы диагностики.
Обновляется именно слой-владелец. Bundle страницы может измениться без обновления браузера, пакет драйвера - при прежнем бинарнике, а новый браузер - при прежнем wrapper. Сначала сравнивайте версии артефактов, иначе неизвестную входную переменную легко приписать неизменившемуся компоненту.
Версии создают разную работу по сопровождению
Автоматическая загрузка драйвера удобна, но нужно знать выбранный артефакт. Зафиксируйте версию пакета, решение о загрузке, путь и версию драйвера, а также версию браузера. Import не доказывает, какой исполняемый файл был выбран.
Минимальная запись запуска может содержать:
| Поле | Смысл | Зачем нужно |
|---|---|---|
packageVersion | Установленная версия Python-дистрибутива | Определяет код пакета, не обязательно бинарник Chrome |
sourceRevision | Tag или commit исходников | Отличает ветку от выпуска |
driverVersion | Версия выбранного WebDriver | Помогает разбирать запуск и совместимость |
browserVersion | Версия из сессии браузера | Определяет окружение страницы |
requestedOptions | Явные параметры без секретов | Показывает запрос клиента |
returnedCapabilities | Выбранные публичные поля | Показывает результат переговоров |
fixtureRevision | Commit собственной fixture | Стабилизирует объект наблюдения |
observedAt | Время и идентификатор окружения | Даёт сравнивать запуски |
Фраза README о тестировании beta-версий Chrome не является гарантией конкретной версии, ОС, драйвер или CI-образа. Важную комбинацию следует отдельно записать и проверить в контролируемом окружении. Неизвестное поле оставляйте неизвестным.
Кэш чистого CI может выбрать другой бинарник, чем долговечная рабочая станция. Записывайте разрешённый путь и версию, но не публикуйте секреты и приватные пути. Hash при разрешённом раскрытии различает бинарники, но не объясняет удалённый результат.
Различайте четыре отказа: изменился выбор драйвера; изменились переговоры сессии; изменилось выполнение браузера на fixture; изменился результат приложения при правильном чтении fixture. 403 не доказывает, что причиной был конкретный сигнал. Сохраняйте первый отказ и данные его владельца.
Даже без обновления браузера пакет мог изменить разрешение драйвера или создание сессии. И наоборот, браузер мог изменить результат при прежнем пакете. Записывайте обе стороны.
Отдельно стоит зафиксировать, откуда взят бинарник драйвера, потому что автоматическая загрузка обращается к сети и может вернуть другой файл при том же номере версии. Сохраните источник загрузки, ожидаемый hash и фактически полученный hash, если политика позволяет их раскрыть. Когда источник недоступен, запись должна прямо говорить об этом, а не подставлять версию пакета вместо версии драйвера. Разница между ожидаемым и полученным hash объясняет расхождение лучше, чем повторный запуск того же сценария.
Измерение собственной fixture без вердикта
Собственная fixture проверяет ожидаемые значения тестового harness. Она не должна обращаться к детектору или классифицировать коммерческую защиту. Используйте локальное приложение или внутренний домен, контролируйте разметку, API и ожидаемый результат, применяйте синтетические данные.
Сначала создайте baseline с одной конфигурацией, затем измените ровно одну переменную. Не меняйте одновременно пакет, браузер, профиль, bundle, viewport и ОС: иначе причина различия неизвестна.
Следующий JSON - предлагаемая схема, а не измеренный результат. Значения в угловых скобках требуют реального запуска; выполнение BotBrowser или undetected-chromedriver здесь не заявляется.
{
"fixtureOrigin": "https://owned-fixture.example.test",
"fixtureRevision": "<commit-sha>",
"package": {
"name": "<package-name>",
"version": "<resolved-version>",
"sourceRevision": "<release-tag-or-commit>"
},
"browser": {
"driverVersion": "<reported-driver-version>",
"browserVersion": "<reported-browser-version>",
"platformName": "<reported-platform>"
},
"requestedOptions": ["<sanitized-option-name>"],
"observations": [
{
"surface": "navigator.webdriver",
"expected": "<fixture-specific-expectation>",
"observed": "<actual-fixture-value>",
"match": false
}
],
"applicationResult": {
"httpStatus": 200,
"fixtureSchemaValid": true
},
"observedAt": "<UTC-timestamp>"
}
Перед использованием записи как доказательства замените все placeholders реальными данными. Ожидание относится только к этой fixture. Пропущенное поле обозначайте null и объясняйте причину. Не называйте пример успешным и не выдумывайте дату.
Fixture должна возвращать небольшой явный ответ, а не собирать полный fingerprint. Endpoint может вернуть ревизия и наблюдение navigator.webdriver; отдельный server log может записать загрузку. Canvas, fonts, локальные адреса и account ID для этого сравнения не нужны. Минимизация данных связывает тест с acceptance case.
| Запуск | Изменённый вход | Версии пакета и браузера | Наблюдение страницы | Результат fixture | Интерпретация |
|---|---|---|---|---|---|
| A | Baseline | Записанные package, драйвер и браузер | Точное значение собственной страницы | HTTP и схема | Только baseline |
| B | Один документированный вход | Те же версии, кроме переменной | Точное значение собственной страницы | HTTP и схема | Различие относится к изменённому входу, не к чужому вердикту |
Повторяйте только при возможной недетерминированности и записывайте каждую попытку. Ошибка контролируемой fixture должна содержать HTTP status и результат схема. Успешный HTTP может содержать неверные данные; отказ может корректно означать неавторизованный запрос.
Чтение записи по отказавшему слою
Начинайте с самого раннего отказа. Без запуска браузера нет наблюдения страницы; без создания новой сессии нельзя трактовать старое значение как новое. Если fixture загрузилась, но схема не прошла, отделяйте проблему извлечения от версии браузера.
| Доказательство | Что подтверждает | Что неизвестно |
|---|---|---|
| Lock и source ревизия пакета | Установленный выпуск или snapshot | Выполнилась ли каждая ветка |
| Startup log и версия драйвера | Какой драйвер запустился | Как сайт понял сессию |
| Returned capabilities | Поля, возвращённые remote end | Изменила ли каждая параметр страницу |
| Наблюдение собственной fixture | Что fixture прочитала | Что собрал и решил чужой сервис |
| HTTP и схема fixture | Приняла ли контролируемая программа запись | Разрешён ли доступ к третьему сайту |
Если capabilities отличаются от запроса, проверяйте создание сессии. Если меняется значение fixture, сравнивайте браузер, профиль, ОС и ревизия. Если внешний сайт отвечает страницей отказа, остановитесь и следуйте его опубликованной политике. Ответ сам по себе не называет ответственную сигнал.
Сокращайте logs и удаляйте cookies, authorization headers, account data, содержимое профиля и machine secrets. Сохраняйте ревизия, очищенные параметрs, категории результата и время, достаточные для связи с CI job. Сравнивая пакеты, используйте одну fixture и одни данные; различия конфигурации драйвер записывайте явно и не смешивайте с обновлением браузера.
Место настройки браузера
Настройка на уровне браузера отвечает на другой вопрос сопровождения, чем изменение пакета WebDriver. Она передаёт документированные параметры при старте или через профиль, а не только через page wrapper или изменение драйвер. Выбор зависит от поддержанных входов, интерфейса автоматизации, ОС и политики обновлений.
Документация профилей BotBrowser описывает поддерживаемый вход, а справочник по automation consistency - границы продукта. Эти источники не доказывают поддержку Selenium, Grid или undetected-chromedriver, если интеграция не описана явно. Запуск исполняемый файл не равен проверенной WebDriver интеграции.
Задайте три вопроса: какой компонент владеет изменением, какую версию нужно отслеживать и какая доказательство подтверждает значение на контролируемой странице. Это инженерный выбор, а не универсальный результат detection.
BotBrowser передаёт документированные значения уровня браузера через настройку профиля; он не изменяет сторонний драйвер и не обещает решение детектора, ответ сайта, идентичность, разрешение или доступ. Наличие профиля не доказывает загрузку; для этого нужна поддержанная доказательство. Fixture остаётся доказательством наблюдённых ею значений.
Это не руководство по обходу. Здесь нет последовательности достижения защищённой страницы или изменения сигналов до принятия сессии. При отказе сайта соблюдайте его политику и используйте разрешённый путь интеграции.
Вопросы и ответы
Доказывает ли README работу текущего выпуска повсюду?
Нет. README описывает цель и реализацию проекта, но не полную датированную матрицу версий сервисов, аккаунтов, браузер builds и окружений.
Доказывают ли returned capabilities загрузку профиля?
Нет. Это данные WebDriver-сессии. Загрузка профиля - отдельный факт запуска и требует доказательство продукта.
Является ли navigator.webdriver оценкой детектора?
Нет. Это свойство браузера, указывающее управление автоматизацией; оно не кодирует модель или решение провайдера.
Предсказывает ли локальная fixture решение коммерческой защиты?
Нет. Она проверяет только собственный контракт в записанных условиях.
Что записать при сравнении версий?
Package/source ревизия, драйвер и браузер version, очищенные параметрs, fixture ревизия, наблюдаемое API и отдельные HTTP/схема результаты. Меняйте один вход.
Что читать дальше
Границы JavaScript-модификаций страницы описаны в материале о границах патчей страницы, а входы профиля рассматривает интеграция Selenium с профилем.
Источники
- Публичный репозиторий и README undetected-chromedriver
- Selenium: Chrome
- Selenium: browser options
- BotBrowser automation consistency
- Настройка профиля BotBrowser
- MDN: Navigator.webdriver
Практический вывод
Сначала сравнивайте владельца, затем утверждение. README описывает пакет, который загружает и изменяет драйвер; Selenium записывает переговоры сессии; профиль задаёт документированные значения браузера; собственная страница сообщает только прочитанное. Записывайте версии отдельно, меняйте один контролируемый вход и разделяйте запуск, согласование сессии, наблюдение страницы и результат приложения. Это не доказывает идентичность и не предсказывает сторонний решение. Для авторизованной работы выбирайте поддерживаемую сопровождаемую интеграцию и соблюдайте границу доступа сайта.
Эта статья входит в руководство: Начало работы с автоматизацией браузера: карта
Похожие статьи
Недетектируемый браузер: что считывает детектор
Начало работыСбор данных Selenium: capabilities и записи
Начало работыSelenium без окна: ChromeOptions и различия
Начало работыФиксация и обновление версий браузерной автоматизации
Начало работыНачало работы с автоматизацией браузера: карта
Начало работыИнтеграция браузерного профиля с Selenium
Выполните ту же проверку в BotBrowser
Загрузите профиль, сохраните внутри браузера те сигналы, о которых только что прочитали, и подтвердите результат на своей машине до раскатки.