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

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

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

  • Создайте 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. Добавьте созданный прокси .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-пример, перейдите в оригинальное сообщение

Ответ 2

После того, как вас вдохновили юнит-тесты в селеновом github repo. Это сработало для меня:

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()

Ответ 3

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

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() 

Ответ 4

Вы попробовали PROXY_HOST = "http://username:[email protected]"?

Также:

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