Selenium с использованием Python: введите / предоставьте пароль http-прокси для firefox

Я хочу использовать селен с прокси, который защищен паролем. Прокси не фиксированный, а переменная. Так что это должно быть сделано в коде (просто настроить firefox на этой конкретной машине для работы с прокси-сервером не совсем идеально). Пока у меня есть следующий код:

fp = webdriver.FirefoxProfile()
# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
fp.set_preference("network.proxy.type", 1)

fp.set_preference("network.proxy.http", PROXY_HOST)
fp.set_preference("network.proxy.http_port", PROXY_PORT)

driver = webdriver.Firefox(firefox_profile=fp)
driver.get("http://whatismyip.com")

В этот момент появляется диалоговое окно с запросом прокси-пользователя / прохода.

Есть ли простой способ:

  1. Введите user/pass в диалоговом окне.
  2. Предоставить пользователю / пройти на более ранней стадии.

5 ответов

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

Вот как это работает для Chrome (в моем случае):

  1. Создайте zip-файл proxy.zip, содержащий два файла:

background.js

var config = {
    mode: "fixed_servers",
    rules: {
      singleProxy: {
        scheme: "http",
        host: "YOU_PROXY_ADDRESS",
        port: parseInt(YOUR_PROXY_PORT)
      },
      bypassList: ["foobar.com"]
    }
  };

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "YOUR_PROXY_USERNAME",
            password: "YOUR_PROXY_PASSWORD"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
        callbackFn,
        {urls: ["<all_urls>"]},
        ['blocking']
);

Не забудьте заменить YOUR_PROXY_* на свои настройки.

manifest.json

{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "<all_urls>",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    },
    "minimum_chrome_version":"22.0.0"
}
  1. Добавьте созданный proxy.zip как расширение

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_extension("proxy.zip")
    
    driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
    driver.get("http://google.com")
    driver.close()
    

Вот и все. Для меня это сработало как шарм. Если вам нужно динамически создать proxy.zip или вам нужен пример PHP, перейдите к исходному сообщению.

Код работал для меня

from selenium import webdriver

browser=webdriver.Firefox()

def login(browser):

    alert=browser.switch_to_alert()
    alert.send_keys("username"+webdriver.common.keys.Keys.TAB+"password")
    alert.accept() 

После вдохновения от юнит-тестов в репозитории Selen GitHub. Это сработало для меня:

from selenium import webdriver

PROXY_HOST = "IP_address"
PROXY_PORT = "your_proxy_port"
USERNAME = "your_user_name" 
PASSWORD = "YOUR_PASSWORD"

profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", PROXY_HOST)
profile.set_preference("network.proxy.http_port", PROXY_PORT)
profile.set_preference("network.proxy.socks_username", USERNAME)
profile.set_preference("network.proxy.socks_password", PASSWORD)

profile.update_preferences()

# executable_path  = define the path if u don't already have in the PATH system variable. 
browser = webdriver.Firefox(firefox_profile=profile)
browser.get('http://website.com')
browser.maximize_window()

Selenium 4 имеет встроенное решение для базовой аутентификации.

      // This "HasAuthentication" interface is the key!
HasAuthentication authentication (HasAuthentication) driver;

// You can either register something for all sites
authentication.register(() -> new UsernameAndPassword("admin", "admin"));

// Or use something different for specific sites
authentication.register(
  uri -> uri.getHost().contains("mysite.com"),

новое имя пользователя и пароль («AzureDiamond», «hunter2»));

https://www.selenium.dev/blog/2021/a-tour-of-4-authentication/

Ты пробовал PROXY_HOST = "http://username:password@proxy.host.com"?

Также:

Начиная с Selenium 2.0 beta 1, есть встроенная поддержка для обработки всплывающих диалоговых окон.

Другие вопросы по тегам