Невозможно получить доступ к незащищенному https с помощью селена с помощью прокси-сервера browsermob

Я пытаюсь встроить прокси-сервер browsermob в свою структуру селена (хром) для автоматического тестирования пользовательского интерфейса, чтобы перехватывать ответы и другие сети.

Описание :

Веб-драйвер Selenium использует прокси-сервер browsermob, и он отлично работает — URL-адреса HTTP и HTTPS в порядке. Когда я пытаюсь перейти по незащищенному URL-адресу HTTPS, я получаю эту ошибку Chrome: ERR_TUNNEL_CONNECTION_FAILED

Вот мой код на питоне:

class Browser(object):
    display = None
    browser = None

    def __init__(self, implicitly_wait_seconds=10, is_visible=True, display_size=None, browser_name='chrome'):
        if not is_visible:
            self.display = Display(display_size)
        self.server = Server('/home/erez/Downloads/browsermob-proxy-2.1.4/bin/browsermob-proxy')
        self.server.start()
        self.proxy = self.server.create_proxy()
        self.capabilities = DesiredCapabilities.CHROME
        self.proxy.add_to_capabilities(self.capabilities)
        self.proxy.new_har("test", options={'captureHeaders': True, 'captureContent': True})
        self.start_browser(display_size, implicitly_wait_seconds, browser_name)

    def __enter__(self):
        return self

    def __exit__(self, _type, value, trace):
        self.close()

    def start_browser(self, display_size, implicitly_wait_seconds=10, browser_name='chrome'):
        if browser_name == 'chrome':
            chrome_options = Options()
            # chrome_options.add_argument("--disable-extensions")
            chrome_options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])
            chrome_options.add_argument("--ssl-version-max")
            chrome_options.add_argument("--start-maximized")
            chrome_options.add_argument('--proxy-server=%s' % self.proxy.proxy)
            chrome_options.add_argument('--ignore-certificate-errors')
            chrome_options.add_argument('--allow-insecure-localhost')
            chrome_options.add_argument('--ignore-urlfetcher-cert-requests')
            self.browser = webdriver.Chrome(os.path.dirname(os.path.realpath(__file__)) + "/chromedriver",
                                            chrome_options=chrome_options, desired_capabilities=self.capabilities)
            self.browser.implicitly_wait(implicitly_wait_seconds)

person Erez Weinstein    schedule 06.04.2017    source источник


Ответы (4)


Попробуйте использовать это

self.capabilities['acceptSslCerts'] = True
person Dmitry Danilov    schedule 28.09.2018

Вы также можете вызвать create_proxy с trustAllServers в качестве аргумента:

self.proxy = self.server.create_proxy(params={'trustAllServers':'true'})
person Alexander Köhler    schedule 06.05.2019

Я столкнулся с той же проблемой для проксирования SSL с помощью BrowserMob Proxy. Для этого вам необходимо установить в браузере сертификат, указанный в этой ссылке.

Перейдите к нижней части документа, и вы увидите раздел под названием «Поддержка SSL». Установите ca-certificate-rsa.cer в свой браузер, и больше не будет проблем с проксированием SSL.

person Soumyajit Basu    schedule 05.09.2017
comment
Это не сработало для меня. Решение, приведенное ниже opsec для использования REST, работает. - person Ganesh S; 03.08.2018

Если установка сертификатов Browsermobs/тестовых серверов не будет работать, как в моем случае, не самый элегантный способ, но выполняет свою работу:

Вы можете обойти ошибку ERR_TUNNEL_CONNECTION_FAILED, передав параметр trustAllServers экземпляру прокси, который отключит проверку сертификата для вышестоящих серверов. К сожалению, насколько я знаю, эта функциональность не реализована в Python-оболочке Browsermobs.

Однако вы можете запустить прокси с параметром через REST API Browsermobs (см. раздел REST API @ https://github.com/lightbody/browsermob-proxy/blob/master/README.md). В случае Python, запросы могут быть выходом.

Вот фрагмент:

import json
import requests
from browsermobproxy import Server
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Start the proxy via python
server = Server('/path_to/bin/browsermob-proxy')
server.start()

# Start proxy instance with trustAllServers set to true, store returned port number
r = requests.post('http://localhost:8080/proxy', data = {'trustAllServers':'true'})
port = json.loads(r.text)['port']

# Start Chromedriver, pass on the proxy
chrome_options = Options()
chrome_options.add_argument('--proxy-server=localhost:%s' % port)
driver = webdriver.Chrome('/path_to/selenium/chromedriver', chrome_options=chrome_options)

# Get a site with untrusted cert
driver.get('https://site_with_untrusted_cert')

Кроме того, если вам нужно получить доступ к HAR-данным, вам нужно будет сделать это также через REST API:

requests.put('http://localhost:8080/proxy/%s/har' % port, data = {'captureContent':'true'})

r = requests.get('http://localhost:8080/proxy/%s/har' % port)

Конечно, поскольку вы отключаете функции безопасности, этот параметр следует использовать только в ограниченных целях тестирования.

person opsec    schedule 05.05.2018