web-dev-qa-db-fra.com

Sélénium - python. comment capturer la réponse du trafic réseau

J'utilise python Django pour créer une application web. J'utilise Selenium pour lancer un navigateur sans tête (phantomjs) et faire quelques clics jusqu'à ce que j'atteigne un particulier Je souhaite capturer le trafic réseau et obtenir la réponse d'un appel réseau particulier. Cet appel réseau contient en fait un document html comme réponse.

Une manière d'y parvenir?

4
Rich Rajah

Vous pouvez accéder aux journaux du navigateur ou de chromedriver, ils sont légèrement différents en ce qui concerne les réponses du réseau. Le journal du navigateur s'appelle performance et le journal du pilote s'appelle driver. Ils renvoient un objet de type json, que vous pouvez analyser pour extraire des événements avec des méthodes Network à l'intérieur:

{'level': 'INFO',
  'message': '{"message":{"method":"Page.frameStoppedLoading","params":{"frameId":"FB10764A3ABF7FFC83110C39C5F7BF77"}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  'timestamp': 1538607113832},
 {'level': 'INFO',
  'message': '{"message":{"method":"Page.frameDetached","params":{"frameId":"FB10764A3ABF7FFC83110C39C5F7BF77"}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  'timestamp': 1538607113838},
 {'level': 'INFO',
  'message': '{"message":{"method":"Network.requestWillBeSent","params":{"documentURL":"https://stackoverflow.com/questions/52633697/Selenium-python-how-to-capture-network-traffics-response","frameId":"C2D13BD13CF743B6D0695B35E9CC935C","hasUserGesture":false,"initiator":{"type":"other"},"loaderId":"5331BFDC4F466FCED920CFC9F033D2EC","request":{"headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"},"initialPriority":"VeryHigh","method":"GET","mixedContentType":"none","referrerPolicy":"no-referrer-when-downgrade","url":"https://stackoverflow.com/questions/52633697/Selenium-python-how-to-capture-network-traffics-response"},"requestId":"5331BFDC4F466FCED920CFC9F033D2EC","timestamp":104499.729,"type":"Document","wallTime":1538607113.838206}},"webview":"C2D13BD13CF743B6D0695B35E9CC935C"}',
  'timestamp': 1538607113839},...}

Vous devez activer la connexion dans DesiredCapabilities puis l'analyser à l'aide du module JSON:

import json
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.CHROME
caps['loggingPrefs'] = {'performance': 'ALL'}
driver = webdriver.Chrome(desired_capabilities=caps)
driver.get('https://stackoverflow.com/questions/52633697/Selenium-python-how-to-capture-network-traffics-response')

def process_browser_log_entry(entry):
    response = json.loads(entry['message'])['message']
    return response

browser_log = driver.get_log('performance') 
events = [process_browser_log_entry(entry) for entry in browser_log]
events = [event for event in events if 'Network.response' in event['method']]

Je ne sais pas si vous pouvez accéder aux données de réponse elles-mêmes en utilisant cela, mais vous pouvez obtenir une URL de la réponse.

7
hellpanderr