Назад в Центр знаний
Начало работы

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 показывает свойство конкретной сессии, но не доказывает личность, разрешение или решение детектора.

Содержание

Что описывает проект

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
sourceRevisionTag или commit исходниковОтличает ветку от выпуска
driverVersionВерсия выбранного WebDriverПомогает разбирать запуск и совместимость
browserVersionВерсия из сессии браузераОпределяет окружение страницы
requestedOptionsЯвные параметры без секретовПоказывает запрос клиента
returnedCapabilitiesВыбранные публичные поляПоказывает результат переговоров
fixtureRevisionCommit собственной 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Интерпретация
ABaselineЗаписанные 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 описывает пакет, который загружает и изменяет драйвер; Selenium записывает переговоры сессии; профиль задаёт документированные значения браузера; собственная страница сообщает только прочитанное. Записывайте версии отдельно, меняйте один контролируемый вход и разделяйте запуск, согласование сессии, наблюдение страницы и результат приложения. Это не доказывает идентичность и не предсказывает сторонний решение. Для авторизованной работы выбирайте поддерживаемую сопровождаемую интеграцию и соблюдайте границу доступа сайта.

#Undetected Chromedriver#Selenium#Профили Браузера#Автоматизация Браузера

Эта статья входит в руководство: Начало работы с автоматизацией браузера: карта

Выполните ту же проверку в BotBrowser

Загрузите профиль, сохраните внутри браузера те сигналы, о которых только что прочитали, и подтвердите результат на своей машине до раскатки.