[Python / Selenium] Regarder les requêtes qui passent dans…
Lorsqu’on utilise Selenium, parfois on souhaiterait retrouver les requêtes qui passent dans le réseau (XHR, images, …).
Lorsqu’on utilise le module de développement de Firefox ou Chrome, on a la possibilité de voir toutes les requêtes qui passent dans l’onglet Network.
Si on souhaite avoir des informations sur ce contenu dans Selenium avec Python, on peut faire comme ça :
from time import sleep
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
import json
import base64
# Requêtes Chrome
capabilities = DesiredCapabilities.CHROME
# capabilities["loggingPrefs"] = {"performance": "ALL"} # Pour chromedriver < ~75
capabilities["goog:loggingPrefs"] = {"performance": "ALL"} # Pour chromedriver 75+
driver = webdriver.Chrome(
desired_capabilities=capabilities, executable_path="chromedriver89.exe" # Mettre ici le bon driver
)
# On va à l'adresse qui nous intéresse.
driver.get("https://www.google.com")
sleep(5) # On attend que la page ait le temps de se charger.
# On extrait toutes les requêtes.
logs_raw = driver.get_log("performance")
logs = [json.loads(lr["message"])["message"] for lr in logs_raw]
# Filtre à appliquer sur les requêtes.
def log_filter(log):
return (
# Il s'agit d'une réponse
log["method"] == "Network.responseReceived"
# Il s'agit d'une image
# and "jpeg" in log["params"]["response"]["mimeType"]
)
for log in filter(log_filter, logs):
request_id = log["params"]["requestId"]
resp_url = log["params"]["response"]["url"]
mime = log["params"]["response"]["mimeType"]
print(f"Caught {resp_url}")
print(f"Mime: {mime}")
# On récupère le contenu.
content = driver.execute_cdp_cmd("Network.getResponseBody", {"requestId": request_id})
if content['base64Encoded']:
content = base64.b64decode(content['body'])
else:
content = content['body']
# print(content)