6

我正在尝试将 browsermob 代理嵌入到我的 selenium (chrome) 框架中以进行 UI 自动化测试,以拦截响应和其他网络。

描述 :

Selenium webdriver 使用 browsermob 代理,它工作得很好 - HTTP 和安全的 HTTPS URL 都可以。当我尝试导航到不安全的 HTTPS URL 时,我收到了这个 chrome 错误:ERR_TUNNEL_CONNECTION_FAILED

这是我的python代码:

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

4 回答 4

4

您还可以使用 trustAllServers 作为参数调用 create_proxy:

self.proxy = self.server.create_proxy(params={'trustAllServers':'true'})
于 2019-05-06T12:44:59.240 回答
3

对于使用 BrowserMob 代理的 SSL 代理,我遇到了同样的问题。为此,您必须在浏览器中安装已在此链接中定义的证书

转到文档底部,您将看到一个名为“SSL 支持”的部分。在您的浏览器中安装 ca-certificate-rsa.cer,SSL 代理将不再有问题。

于 2017-09-05T03:11:31.167 回答
3

试试用这个

self.capabilities['acceptSslCerts'] = True
于 2018-09-28T08:07:34.230 回答
2

如果安装 Browsermobs/测试服务器证书无法完成工作,就像在我的情况下,不是最优雅的方式,但可以完成工作:

您可以通过将 trustAllServers 参数传递给代理实例来绕过 ERR_TUNNEL_CONNECTION_FAILED 错误,这将禁用上游服务器的证书验证。不幸的是,据我所知,该功能尚未在 Browsermobs Python 包装器中实现。

但是,您可以通过 Browsermobs REST API 使用参数启动代理(请参阅 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)

当然,由于您要禁用安全功能,因此此参数应仅用于有限的测试目的。

于 2018-05-05T12:53:51.287 回答