# Использование прокси с Selenium WebDriver (Chrome и Firefox)

Классическая проблема Selenium — аутентификация: браузер показывает запрос учётных данных, который WebDriver не может заполнить. Есть два удобных решения: добавить сервер в белый список или поручить Selenium Wire передавать учётные данные.


## Вариант 1: белый список IP-адресов (рекомендуется для серверов)

Добавьте публичный IPv4-адрес сервера в [белый список](https://hodlproxy.com/ru/docs/authentication) на панели управления. Тогда Chrome нужен только адрес прокси, и запрос учётных данных не появляется. Ограничение: если браузер не получает запрос аутентификации, он не отправляет имя пользователя, поэтому шлюз не может прочитать параметры таргетинга и использует пул учётной записи по умолчанию. Если каждой сессии нужна своя страна или идентификатор закреплённой сессии, используйте вариант 2.

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opts = Options()
opts.add_argument("--proxy-server=http://res.hodlproxy.com:9000")
opts.add_argument("--headless=new")
driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
```


## Вариант 2: Selenium Wire (имя пользователя, пароль и параметры)

Selenium Wire запускает локальный прокси, который добавляет учётные данные, поэтому URL HodlProxy со всеми параметрами работает без изменений.

```python
from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options

proxy = "http://USER-cc-de-city-berlin-sid-sel1-ttl-30m:PASS@res.hodlproxy.com:9000"
sw_options = {"proxy": {"http": proxy, "https": proxy, "no_proxy": "localhost,127.0.0.1"}}

opts = Options()
opts.add_argument("--headless=new")
driver = webdriver.Chrome(seleniumwire_options=sw_options, options=opts)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()
```

> Warn: Selenium Wire локально перехватывает TLS, чтобы добавить заголовки, и устанавливает собственный сертификат в управляемый браузер. Это подходит для автоматизации, но не для задач, где важна целостность сертификата.


## Firefox

```python
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

opts = Options()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.http", "res.hodlproxy.com")
opts.set_preference("network.proxy.http_port", 9000)
opts.set_preference("network.proxy.ssl", "res.hodlproxy.com")
opts.set_preference("network.proxy.ssl_port", 9000)
opts.set_preference("media.peerconnection.enabled", False)  # без утечки WebRTC
driver = webdriver.Firefox(options=opts)  # сервер в белом списке, без запроса данных
```


## Практические правила

- Используйте один драйвер для каждого идентификатора сессии; драйверы поддерживают соединения активными, поэтому выходной узел остаётся прежним до окончания срока жизни сессии.
- Используйте `--headless=new` в Chrome: старый безголовый режим имеет характерный цифровой отпечаток.
- Установите язык и часовой пояс браузера в соответствии со страной выходного узла; Selenium Wire также может перезаписать `Accept-Language`.


## Вопросы

**Почему Chrome показывает запрос учётных данных прокси при работе с Selenium?**

В WebDriver нет API для ответа на диалог аутентификации прокси. Добавьте свой IP-адрес в белый список, чтобы запрос не появлялся, или запустите Selenium Wire, который добавит заголовок Proxy-Authorization.

Источник: https://hodlproxy.com/ru/guides/selenium-proxy
