Selenium offline

0

Kojarzy ktoś jakiś sposób w selenieum (albo w innym narzędziu), w którym da się uruchomić selenium, ale w taki sposób żeby móc nadpisać/przechwycić requesty które selenium rzuca? Najlepiej bez dodatkowego servera, tak żeby dało się odpalić samo selenium.

Idealnie chciałbym zrobić takie coś, że:

  1. Odpalam selenium
  2. Jakoś przekazuję do selenium callback albo proces
  3. Nawiguję na jakąś stronę
  4. Selenium próbuje otworzyć stronę i wszystkie zasoby (skrypty, style, fonty, etc.), i nie strzela po requeście seciowym, tylko najpierw leci do mojego callbacka
  5. Mogę zwrócić treść, której selenium użyje do uruchomienia strony.

W skrócie próbuję użyć selenium jako runtime'u strony, i wszystkie użyte zasoby chciałbym przekazać explicitly (żeby selenium sam nie strzelał po faktyczne zasoby z neta).

Kojarzy ktoś coś takiego?

1

Nie korzystam z Selenium, ale tutaj coś znalazłem w dokumentacji jakiś NetworkInterceptor:
https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/devtools/NetworkInterceptor.html
O to chodzi?

0

Napisałem w pythonie taki skrypt z użycieum selenium-wire, plik Cat03.jpg umieszczony w tym samym katalogu.

from seleniumwire import webdriver

def interceptor(request):
    if ".jpg" in request.url:
        request.abort()
        request.create_response(status_code=200,
                                headers={'Content-Type': 'image/jpg'},
                                body=open('Cat03.jpg', 'rb').read())

driver = webdriver.Chrome()
driver.request_interceptor = interceptor
driver.get("https://pl.m.wikipedia.org/wiki/Lira_da_gamba")

I ładnie zdjęcia na stronie, które są plikami jpg zamienia na ten z dysku plik, można jakieś requły napisać prosto, żeby wyszukiwało lokalnie pliki na dysku po ich nazwach w url i zwracało.
Z tego co widzę to ten selenium-wire ustawia proxy w selenium i daje interface, łatwo tego użyć.

0

Robiłem ostatnio coś podobnego, tu działający kod:

import json

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

def process_browser_logs_for_network_events(logs):
    for entry in logs:
        log = json.loads(entry["message"])["message"]
        if (
                "Network.response" in log["method"]
                or "Network.request" in log["method"]
                or "Network.webSocket" in log["method"]
        ):
            yield log

capabilities = DesiredCapabilities.CHROME
capabilities["goog:loggingPrefs"] = {"performance": "ALL"}
chrome_options = Options()
chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(options=chrome_options)

driver.get("https://google.com")

logs = driver.get_log("performance")
events = process_browser_logs_for_network_events(logs)
for event in events:
    headers = event['params'].get('headers', {})
    print(headers.get(':path', ""))

driver.quit()

EDIT: dobra trochę źle zrozumiałem, tu tylko przechwytuje requesty, nie modyfikuję ich w żaden sposób

1 użytkowników online, w tym zalogowanych: 0, gości: 1