Как запустить веб-драйвер selenium за прокси-сервером, который нуждается в аутентификации в python

В настоящее время это мой код, но webDriver показывает всплывающее окно для ввода учетных данных прокси-сервера, и я не хочу этой досадной ситуации. Это не первый случай, когда тот же вопрос появился в stackoverflow, но никто не ответил правильный ответ.

Я попробовал google, чтобы найти решение этой проблемы. Я узнал о решении в java, но я не знаю, как мы это делаем в python.

    PROXY_HOST = "65.49.1.59"
    PROXY_PORT = 60099
    fp = webdriver.FirefoxProfile()
    # Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5

    print " im in parse_details"

    fp.set_preference("network.proxy.type", 1)
    fp.set_preference('network.http.phishy-userpass-length', 255)

    fp.set_preference("network.proxy.http", PROXY_HOST)
    fp.set_preference("network.proxy.http_port", PROXY_PORT)
    fp.set_preference("network.proxy.ftp", PROXY_HOST)
    fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
    fp.set_preference("network.proxy.ssl", PROXY_HOST)
    fp.set_preference("network.proxy.ssl_port", PROXY_PORT)
    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')
    fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired

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

Эти приведенные ниже утверждения догадываются мной, и я не уверен, правилен ли их синтаксис или нет, даже я пытался найти в документации по селену, но не помогал. Вы бы, ребята, пролили свет на это.

    #fp.set_preference("network.proxy.user_name", 'someusername')
    #fp.set_preference("network.proxy.password", 'somepassword')

p.s. Тот же вопрос задан здесь Selenium с помощью Python: введите/укажите пароль HTTP-прокси для firefox

Ответ 1

Selenium не может обрабатывать базовую аутентификацию, и он не работает с всплывающими окнами. Но эта проблема разрешима. В качестве решения, которое со мной работало (я нашел здесь) заключается в добавлении расширения браузера, который выполняет аутентификацию для Selenium. Это довольно просто. Вот как это работает для Chrome и Python:

  • Создайте 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 в качестве расширения

Код Python:

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

Я знаю, что он довольно поздно ответил на ваш вопрос, но недавно я начал работать с Python и пытался сделать то же самое и сделал что-то подобное, чтобы справиться с этой ситуацией.

Запуск веб-драйвера селена за прокси-сервером

  • Необходимо создать профиль firefox, где должно быть установлено дополнение "autoauth".
  • Попробуйте сохранить имя пользователя и пароль прокси-сервера, нажав URL-адрес вручную.
  • Профиль Firefox сохранит учетные данные прокси-сервера с помощью autoauth
  • В script вызов этого конкретного профиля Firefox.
  • Задайте все настройки для определения данных прокси-сервера.
  • Назначить профиль Firefox в экземпляр браузера
  • Нажмите любой URL-адрес, Ниже приведен пример выполнения

P.S.: Удалите все настройки прокси из интернет-опций, script будет использовать его автоматически

Итак, технически здесь вы не будете отправлять имя пользователя и пароль прокси, вы сохраните эти учетные данные в firefox и вызовите этот конкретный профиль firefox.

Надеюсь, что вы уже давно решили свою проблему, но если она все еще там, это может вам помочь.:)

Ответ 4

Обратитесь к этому пути о том, как получить доступ к профилю firefox: http://software-testing-tutorials-automation.blogspot.jp/2014/05/how-to-create-and-use-custom-firefox.html

В принципе вам нужно создать профиль и использовать этот профиль в firefox. Теперь поведение вашего профиля также будет таким же, когда вы запускаете через селен. Таким образом, если вы будете профилировать proxy auth, то он также будет отображаться, когда вы откроете его через селен. Таким образом, вам нужно найти способ с помощью надстроек, чтобы скрыть аутентификацию с помощью этого профиля. После того, как вы успешно это сделаете, теперь это будет то же самое с Selenium.