2014-04-23 5 views
1

Voici une version condensée de mon code, montrant un problème avec WebDriver et mitmproxy:étrange problème avec 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() 

Si vous exécutez cela, vous devriez voir que firefox chargement pour toujours outlook.com et les délais d'attente sont jamais déclenché.
Le problème se produit uniquement avec mitmproxy. J'ai testé d'autres proxies et ils ont travaillé sur ces URL, mais je ne peux pas les utiliser, car ils ne peuvent pas inspecter le trafic SSL ou simplement fournir des données brutes. Cependant, j'ai compris que mitmproxy devrait être la meilleure solution, si cela fonctionne correctement avec webdriver.
En outre, j'ai testé cela avec mitmproxy lancé sur shell -> même question
et avec webdriver avec Java -> même numéro
De plus, cela arrive parfois sur d'autres URLs comme fc2.com.

Voici un petit aperçu de ma configuration:
- Linux Mint Petra x64
- Python 2.7
- Mitmproxy 0.10.1
- Sélénium 2.41.0
- Firefox 28

Quelqu'un sait-il comment résoudre ce problème?
Pourquoi cela arrive-t-il avec mitmproxy?
En outre, je suis intéressé par des alternatives pour inspecter le trafic http et https avec sélénium.

Mise à jour avec 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() 

Répondre

0

On dirait que vous êtes instanciation mitmproxy tort. Jetez un oeil à https://github.com/mitmproxy/mitmproxy/blob/master/examples/flowbasic, vous avez certainement besoin d'une instance FlowMaster, pas controller.Master.

+0

J'ai changé mon code en utilisant FlowMaster comme vous l'avez proposé (voir mise à jour), mais le même problème se produit. Btw Firefox est passé à la version 29. – Thorben

+0

Votre proxy fonctionne-t-il si vous l'utilisez depuis un navigateur externe? –

+0

Si j'utilise un navigateur externe, https ne fonctionne pas (avec CA installé) et le même problème se produit. Mais si j'utilise le contrôleur, le flux https fonctionne et il n'y a pas de problème dans le FF externe. – Thorben