Аутентификация через прокси в Selenium становится сложной, когда браузер, а не веб-страница, запрашивает имя пользователя и пароль. Правильное решение зависит от типа прокси, браузера, версии Selenium и от того, можно ли предоставить учетные данные вне теста. В этом руководстве описаны надежные подходы для Selenium 4, рассмотрены случаи, когда более старые обходные пути все еще применимы, и объяснено, почему код обработки предупреждений часто дает сбой.

Что такое прокси?

Прокси — это посредник, который отправляет запросы к веб-сайтам от имени вашего браузера. Получатель видит IP-адрес прокси, а не компьютер, на котором запущен Selenium. Команды тестирования используют прокси для проверки работы в разных регионах, маршрутизации трафика через контролируемые сети, проверки запросов или распределения автоматизированных рабочих нагрузок.

URL-адрес прокси-сервера обычно содержит хост и порт, например: proxy.example.test:8080Для работы частных сервисов также может потребоваться имя пользователя и пароль. Selenium может настроить конечную точку прокси через параметры браузера, но запросы на аутентификацию контролируются браузером и не всегда отображаются в WebDriver, как обычная HTML-форма.

Выберите подходящую сеть: Статические адреса удобны для внесения в список разрешенных адресов, в то время как сети с ротацией подходят для крупномасштабного сбора данных. Наши руководство по поставщикам услуг по предоставлению резидентских прокси-серверов объясняет практические различия.

Используйте автоматизацию только при наличии соответствующего разрешения, соблюдайте условия использования веб-сайта и не допускайте попадания учетных данных в исходный код и журналы тестирования.

Разница между SOCKS и HTTP-прокси

HTTP-прокси понимают веб-трафик и обычно настраиваются с отдельными значениями HTTP и HTTPS. SOCKS-прокси работают на более низком уровне и могут передавать различные типы TCP-трафика без интерпретации прикладного протокола. SOCKS5 дополнительно поддерживает аутентификацию и обычно является предпочтительной версией SOCKS.

ХарактеристикаHTTP/HTTPS-проксиSOCKS5 прокси
трафикПредназначено для обработки веб-запросов в браузере.Работает с различными приложениями на основе TCP.
осведомленность о протоколеПонимает HTTP-запросы и заголовки.Перенаправляет трафик без чтения HTTP-семантики.
Настройка SeleniumЗадайте поля для HTTP и SSL-прокси.Укажите конечную точку SOCKS и версию.
Типичное использованиеВеб-тестирование, фильтрация, кэширование, проверкаГибкое туннелирование и трафик, не относящийся к HTTP.

Браузер и прокси-сервер должны поддерживать один и тот же метод. Наличие действительной конечной точки не гарантирует, что Selenium сможет автоматически завершить диалог ввода имени пользователя/пароля.

Как обрабатывать прокси в Selenium Webdriver в Chrome

Для прокси-сервера, не требующего интерактивной аутентификации, Selenium 4 может назначить Proxy Возражать ChromeOptions, Электрический ток официальная документация Selenium browser-options демонстрирует этот подход, основанный на возможностях.

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

Proxy proxy = new Proxy();
proxy.setHttpProxy("proxy.example.test:8080");
proxy.setSslProxy("proxy.example.test:8080");

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");

Для SOCKS5 укажите конечную точку SOCKS и версию:

Proxy proxy = new Proxy();
proxy.setSocksProxy("proxy.example.test:1080");
proxy.setSocksVersion(5);

ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);

Использование аутентифицированных прокси-серверов требует дополнительного планирования. Встраивание учетных данных в URL-адрес может быть отклонено современными браузерами и может привести к раскрытию секретной информации. Предпочтительнее использовать следующие подходы:

  1. Внесение IP-адресов в список разрешенных: Разрешите использование фиксированного публичного IP-адреса вашего CI-раннера или узла Selenium Grid, чтобы диалоговое окно в браузере не отображалось.
  2. Локальный шлюз: Разместите на тестовой машине доверенный прокси-сервер переадресации. Selenium подключается локально без учетных данных, а шлюз выполняет аутентификацию вышестоящего сервера.
  3. Управляемое расширение для браузера: Создайте внутреннее расширение Chrome, которое настраивает прокси-сервер и отвечает на запросы аутентификации. Загружайте его только из защищенного тестового артефакта.
  4. Конфигурация на уровне сетки: Вместо того чтобы раздавать учетные данные каждому тесту, настраивайте сеть и секреты на узле Selenium.

Считывайте учетные данные из менеджера секретов или конфигурации теста, специфичной для конкретной среды. Никогда не добавляйте их в Git, не выводите в консоль и не включайте в скриншоты. После запуска проверьте IP-адрес выхода с помощью утвержденной тестовой конечной точки, прежде чем продолжить выполнение набора тестов.

Распространенная ошибка: ERR_PROXY_CONNECTION_FAILED Обычно это указывает на неверный путь к хосту, порту, протоколу или сети. Повторяющиеся ошибки. 407 Proxy Authentication Required Ответы указывают на отсутствие или отклонение учетных данных.

Использование инструмента AutoIt

AutoIt может автоматизировать диалоговые окна Windows, находя нужное окно, вводя учетные данные и нажимая кнопку. Когда-то это был распространенный обходной путь Selenium, поскольку WebDriver не мог работать с окнами аутентификации, принадлежащими браузеру.

Этот метод ненадежен: он работает только под Windows, требует разблокированного интерактивного рабочего стола, зависит от заголовков окон и времени их отображения и обычно дает сбой в безмониторных контейнерах или удаленных агентах CI. Он также может раскрывать пароли через скрипты или аргументы процесса.

Если устаревшая среда не оставляет альтернативы, скомпилируйте скрипт AutoIt, сохраните его в контролируемом месте для тестовых артефактов, безопасно получите учетные данные во время выполнения и дождитесь появления точного диалогового окна, а не используйте фиксированную задержку. Ограничьте этот метод изолированным запуском тестов в Windows. Для поддерживаемых наборов тестов более безопасными вариантами являются внесение IP-адресов в список разрешенных, шлюз или централизованно настроенные узлы Grid.

Использование оповещений

Selenium может обрабатывать JavaScript-оповещения, создаваемые кодом веб-страницы:

Alert alert = new WebDriverWait(driver, Duration.ofSeconds(10))
    .until(ExpectedConditions.alertIsPresent());
alert.accept();

Однако диалоговое окно аутентификации через прокси-сервер обычно отображается в элементах интерфейса браузера, а не в виде JavaScript-сообщения. Поэтому... driver.switchTo().alert() часто бросает NoAlertPresentException даже когда отображается запрос на ввод учетных данных. Это же ограничение относится ко многим диалоговым окнам базовой аутентификации HTTP.

Используйте API оповещений только после подтверждения того, что WebDriver распознает приглашение к вводу. Если это не так, удалите приглашение через сетевую конфигурацию или используйте один из описанных выше подходов с использованием аутентифицированного прокси. Это более стабильно, чем координация нажатий клавиш с окном, которое Selenium не может проверить.

Часто задаваемые вопросы (FAQ)

Можно ли с помощью Selenium напрямую установить прокси-сервер?

Да. Selenium 4 может передавать настройки HTTP, SSL или SOCKS через параметры браузера и возможности прокси. Это настраивает конечную точку, но может не привести к завершению запроса на аутентификацию, принадлежащего браузеру.

Почему в Chrome не работает команда `username:password@host:port`?

Современные браузеры могут блокировать учетные данные, встроенные в URL-адреса, а синтаксис может привести к утечке секретной информации в журналы и историю. Вместо этого используйте список разрешенных IP-адресов, защищенный шлюз или контролируемую тестовую инфраструктуру.

Может ли Selenium обрабатывать вход через прокси с помощью switchTo().alert()?

Обычно нет. Аутентификация через прокси-сервер, как правило, осуществляется через пользовательский интерфейс браузера, а не с помощью JavaScript-сообщений, поэтому WebDriver может сообщить об отсутствии таких сообщений.

Работает ли аутентификация через прокси в Chrome без графического интерфейса?

Это может работать, если аутентификация осуществляется без интерактивного запроса. Для выполнения в безголовом режиме лучше подходят добавление IP-адресов в список разрешенных, локальный шлюз или конфигурация на уровне узла.

Следует ли использовать AutoIt для аутентификации через прокси-сервер Selenium?

Используйте его только для ограниченных возможностей устаревших рабочих процессов Windows. В системах непрерывной интеграции он ненадежен и менее безопасен, чем устранение диалогового окна через сетевую конфигурацию.

Какой тип прокси лучше всего подходит для автоматизации браузера?

Это зависит от разрешенной задачи. HTTP-прокси просты в использовании для веб-трафика, SOCKS5 отличается гибкостью, а домашние сети могут помочь в тестировании местоположения. Сравните варианты в нашем руководстве по типам прокси.