我正在尝试使用我的selenium(chrome)框架嵌入browsermob代理进行UI自动化测试,以拦截响应和其他网络。
描述:
使用browsermob代理的Selenium webdriver工作得很好 - 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)
答案 0 :(得分:2)
我在使用BrowserMob Proxy进行SSL代理时面临同样的问题。为此,您必须在浏览器中安装已在此link
中定义的证书转到文档的底部,您将看到一个名为" SSL支持"的部分。在浏览器中安装ca-certificate-rsa.cer,SSL代理就不会出现问题。
答案 1 :(得分: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)
当然,由于您正在禁用安全功能,因此该参数仅用于有限的测试目的。
答案 2 :(得分:2)
尝试使用此
self.capabilities['acceptSslCerts'] = True
答案 3 :(得分:0)
您还可以使用trustAllServers作为参数调用create_proxy:
self.proxy = self.server.create_proxy(params={'trustAllServers':'true'})