2014-04-23 40 views
1

这里是我的代码的精简版,呈​​现出的webdriver和mitmproxy一个问题:奇怪的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流量或仅提供原始数据输出。不过,我认为mitmproxy应该是最好的解决方案,如果它能与webdriver一起正常工作。
而且我已经测试这与mitmproxy开始壳 - >同样的问题
,并与Java的webdriver - >同样的问题
而且这种情况在其他网址一样,有时fc2.com。

这里是我的配置有点概述:
- Linux Mint的佩特拉64
- 蟒蛇2.7
- Mitmproxy 0.10.1
- 硒2.41.0
- 火狐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() 

回答

0

看起来你被错误实例mitmproxy。看看https://github.com/mitmproxy/mitmproxy/blob/master/examples/flowbasic,你肯定需要一个FlowMaster实例,而不是controller.Master。

+0

我按照您的建议(请参阅更新)使用FlowMaster更改了我的代码,但发生同样的问题。顺便说一句,Firefox已经更改为版本29. – Thorben

+0

如果您从外部浏览器使用它,代理是否可以正常工作? –

+0

如果我使用外部浏览器https不工作(与安装的CA)并且发生相同的问题。但是如果我使用控制器istead流https是工作,并没有问题在外部的FF。 – Thorben