これは私のコードの要約版で、webdriver と mitmproxy の問題を示しています。
from libmproxy import controller
from libmproxy import proxy
import os
from multiprocessing import Process
from selenium import webdriver
from selenium.webdriver.common.proxy import *
import time
# traffic inception
class HttpMitmReporter(controller.Master):
def __init__(self, proxy_server):
controller.Master.__init__(self, proxy_server)
def run(self):
try:
return controller.Master.run(self)
except KeyboardInterrupt:
self.shutdown()
# setup browser with proxy settings etc.
def setup_browser():
global driver
proper_setup = False
proxy_con = "127.0.0.1:8088"
my_proxy = Proxy({'proxyType': ProxyType.MANUAL,
'httpProxy': proxy_con,
'ftpProxy': proxy_con,
'sslProxy': proxy_con,
'noProxy': ''})
while not proper_setup:
try:
driver = webdriver.Firefox(proxy=my_proxy)
driver.set_page_load_timeout(20)
driver.set_script_timeout(20)
proper_setup = True
except Exception as exception:
print exception
try:
driver.quit()
except Exception:
time.sleep(3)
driver = None
# start proxy
config = proxy.ProxyConfig(
cacert=os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem")
)
server = proxy.ProxyServer(config, 8088)
reporter = HttpMitmReporter(server)
mitm_proxy = Process(target=reporter.run)
mitm_proxy.start()
setup_browser()
# urls to test
urls = [
'http://support.microsoft.com/common/survey.aspx?showpage=1&scid=sw%3Bde%3B3663&altStyle=narrow&renderOption=OverrideDefault&fr=1',
'http://outlook.com/',
]
# visit sites
for url in urls:
print url
try:
driver.get(url)
elements = driver.find_elements_by_tag_name('a')
except Exception as ex:
print ex
driver.quit()
setup_browser()
# terminate browser and proxy
driver.quit()
mitm_proxy.terminate()
これを実行すると、Firefox が永久に outlook.com を読み込み、タイムアウトが発生しないことがわかります。
この問題は、mitmproxy でのみ発生します。別のプロキシをテストし、それらはこれらの URL で機能しましたが、SSL トラフィックを検査できないか、生データ出力を提供するだけであるため、それらを使用できません。ただし、webdriver と一緒に適切に動作する場合は、mitmproxy が最適なソリューションであることがわかりました。
さらに、シェルで開始された mitmproxy でこれをテストしました -> 同じ問題
と Java を使用した webdriver -> 同じ問題
さらに、これは fc2.com のような他の URL で時々発生します。
私の構成の概要は次のとおりです。
- Linux Mint Petra x64
- python 2.7
- Mitmproxy 0.10.1
- Selenium 2.41.0
- Firefox 28
この問題を解決する方法を知っている人はいますか?
mitmproxy でこれが起こるのはなぜですか?
さらに、セレンを使用して http および https トラフィックを検査する代替手段に興味があります。
FlowMaster で更新します。
from libmproxy import flow
from libmproxy import proxy
import os
from multiprocessing import Process
from selenium import webdriver
from selenium.webdriver.common.proxy import *
import time
# traffic inception
class HttpMitmReporter(flow.FlowMaster):
def run(self):
try:
flow.FlowMaster.run(self)
except KeyboardInterrupt:
self.shutdown()
def handle_request(self, r):
f = flow.FlowMaster.handle_request(self, r)
if f:
r.reply()
return f
def handle_response(self, r):
f = flow.FlowMaster.handle_response(self, r)
if f:
r.reply()
return f
# setup browser with proxy settings etc.
def setup_browser():
global driver
proper_setup = False
proxy_con = "127.0.0.1:8088"
my_proxy = Proxy({'proxyType': ProxyType.MANUAL,
'httpProxy': proxy_con,
'ftpProxy': proxy_con,
'sslProxy': proxy_con,
'noProxy': ''})
while not proper_setup:
try:
driver = webdriver.Firefox(proxy=my_proxy)
driver.set_page_load_timeout(20)
driver.set_script_timeout(20)
proper_setup = True
except Exception as exception:
print exception
try:
driver.quit()
except Exception:
time.sleep(3)
driver = None
# start proxy
config = proxy.ProxyConfig(
cacert=os.path.expanduser("~/.mitmproxy/mitmproxy-ca.pem")
)
state = flow.State()
server = proxy.ProxyServer(config, 8088)
reporter = HttpMitmReporter(server, state)
mitm_proxy = Process(target=reporter.run)
mitm_proxy.start()
setup_browser()
# urls to test
urls = [
'http://support.microsoft.com/common/survey.aspx?showpage=1&scid=sw%3Bde%3B3663&altStyle=narrow&renderOption=OverrideDefault&fr=1',
'http://outlook.com/',
]
# visit sites
for url in urls:
print url
try:
driver.get(url)
elements = driver.find_elements_by_tag_name('a')
except Exception as ex:
print ex
driver.quit()
setup_browser()
# terminate browser and proxy
driver.quit()
mitm_proxy.terminate()