Вопрос-ответ

Selenium webdriver: Modifying navigator.webdriver flag to prevent selenium detection

Selenium webdriver: изменение navigator.флаг webdriver для предотвращения обнаружения selenium

Я пытаюсь автоматизировать очень простую задачу на веб-сайте с использованием selenium и chrome, но каким-то образом веб-сайт обнаруживает, когда chrome управляется selenium, и блокирует каждый запрос. Я подозреваю, что веб-сайт полагается на открытую переменную DOM, подобную этой https://javalang.ru/a/41904453/648236 для обнаружения браузера, управляемого selenium.

Мой вопрос в том, есть ли способ, которым я могу сделать navigator.флаг webdriver false? Я готов зайти так далеко, что попытаюсь перекомпилировать исходный код selenium после внесения изменений, но, похоже, я не могу найти источник информации Navigatorautomation где-либо в репозитории https://github.com/SeleniumHQ/selenium

Любая помощь очень ценится

P.S: Я также попробовал следующее из https://w3c.github.io/webdriver/#interface

Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});

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

Переведено автоматически
Ответ 1

Сначала обновление 1

execute_cdp_cmd(): Теперь, благодаря доступности execute_cdp_cmd(cmd, cmd_args) command, вы можете легко выполнять Google-chrome-devtools с помощью Selenium. Используя эту функцию, вы можете легко изменить navigator.webdriver, чтобы предотвратить обнаружение Selenium.


Предотвращение обнаружения 2

Чтобы предотвратить обнаружение WebDriver, управляемого Selenium, нишевый подход будет включать в себя любой из перечисленных ниже шагов:


  • Добавление аргумента --disable-blink-features=AutomationControlled


    from selenium import webdriver

    options = webdriver.ChromeOptions()
    options.add_argument('--disable-blink-features=AutomationControlled')
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://www.website.com")



Вы можете найти соответствующее подробное обсуждение в Selenium не может открыть вторую страницу



  • Изменение команды через execute_cdp_cmd() следующим образом:


    #Setting up Chrome/83.0.4103.53 as useragent
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})


  • Измените значение свойства для navigator для webdriver на undefined


    driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")


  • Исключить набор enable-automation переключателей


    options.add_experimental_option("excludeSwitches", ["enable-automation"])


  • Отключить useAutomationExtension


    options.add_experimental_option('useAutomationExtension', False)



Пример кода 3

Выполнение всех шагов, упомянутых выше, и эффективный блок кода будет:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'})
print(driver.execute_script("return navigator.userAgent;"))
driver.get('https://www.httpbin.org/headers')

История

Согласно проекту редактора W3C в текущей реализации строго указано:


webdriver-active Флаг устанавливается на true, когда пользовательский агент находится под удаленным управлением, которое изначально установлено на false.


Далее,

Navigator includes NavigatorAutomationInformation;

Следует отметить, что:


NavigatorAutomationInformation Интерфейс не должен быть доступен в WorkerNavigator.


NavigatorAutomationInformation Интерфейс определяется как:

interface mixin NavigatorAutomationInformation {
readonly attribute boolean webdriver;
};

который возвращает, true если webdriver-active установлен флаг, значение false в противном случае.

Наконец, navigator.webdriver определяет стандартный способ для взаимодействующих пользовательских агентов информировать документ о том, что он контролируется WebDriver, так что во время автоматизации могут запускаться альтернативные пути кода.


Внимание: Изменение / настройка вышеупомянутых параметров может заблокировать навигацию и привести к обнаружению экземпляра WebDriver.



Обновление (6 ноября 2019)

В текущей реализации идеальным способом доступа к веб-странице без обнаружения было бы использовать ChromeOptions() класс для добавления пары аргументов в:


  • Исключить набор enable-automation переключателей

  • Отключить useAutomationExtension

с помощью экземпляра ChromeOptions следующим образом:


  • Пример Java:


    System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    options.setExperimentalOption("useAutomationExtension", false);
    WebDriver driver = new ChromeDriver(options);
    driver.get("https://www.google.com/");


  • Пример Python


    from selenium import webdriver

    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\path\to\chromedriver.exe')
    driver.get("https://www.google.com/")


  • Пример Ruby


      options = Selenium::WebDriver::Chrome::Options.new
    options.add_argument("--disable-blink-features=AutomationControlled")
    driver = Selenium::WebDriver.for :chrome, options: options



Легенды

1: Применяется только к клиентам Selenium на Python.

2: Применяется только к клиентам Selenium на Python.

3: Применяется только к клиентам Selenium на Python.

Ответ 2

ChromeDriver:

Наконец-то нашел простое решение для этого с помощью простого флага! :)

--disable-blink-features=AutomationControlled

navigator.webdriver = true больше не будет отображаться с установленным этим флагом.

Список функций, которые вы можете отключить, ознакомьтесь с ними здесь

Ответ 3

Не используйте команду cdp для изменения значения webdriver, поскольку это приведет к несоответствию, которое позже может быть использовано для обнаружения webdriver. Используйте приведенный ниже код, это удалит все следы webdriver.

options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled")
Ответ 4

Ранее (в окне консоли браузера):

> navigator.webdriver
true

Изменение (в selenium):

// C#
var options = new ChromeOptions();
options.AddExcludedArguments(new List<string>() { "enable-automation" });

// Python
options.add_experimental_option("excludeSwitches", ['enable-automation'])

После (в окне консоли браузера):

> navigator.webdriver
undefined

Это не будет работать для версии ChromeDriver 79.0.3945.16 и выше. Смотрите Примечания к выпуску здесь


java selenium selenium-webdriver