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 не может открыть вторую страницу
Изменение команды user-agent через
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 на undefineddriver.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 и выше. Смотрите Примечания к выпуску здесь