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()
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
Votre proxy fonctionne-t-il si vous l'utilisez depuis un navigateur externe? –
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