Как использовать протокол Chrome DevTools в Selenium (используя Python) для сбора HTTP-запросов и ответов?

Я знаю это Fetch Domainиспользуется для этой цели, но я не знаю, как именно я могу это реализовать. В Selenium python я использовал следующий код, чтобы разрешить выпускrequestPaused События.

driver.execute_cdp_cmd("Fetch.enable",{})
driver.get('https://www.example.com')

Но я не знаю, как мне справиться requestPaused событие (мне нужно позвонить одному fulfillRequest или continueRequest/continueWithAuth). В результате моя программа перестает работать. Я очень признателен, если бы кто-нибудь мог предоставить мне пример, чтобы помочь мне понять, как это работает.

1 ответ

Решение

Да, вы все правильно поняли.

Согласно примечаниям к выпуску Selenium v4.0.0-alpha-3:

* Expose devtools APIs from chromium derived drivers.
* Expose presence of devtools support on a role-based interface

Согласно примечаниям к выпуску Selenium v4.0.0.0-alpha-1:

* Basic support for CDP landed via the "DevTools" interface.

Таким образом, протокол chrome-devtools-protocol будет доступен с selenium4, что позволит инструментам для инструментария, проверки, отладки и профилирования Chromium, Chrome и других браузеров на основе Blink. В обсуждении Controlling Chrome Devtools с помощью Selenium Webdriver @AdiOhana упоминает пример использования нескольких команд из домена Profiler следующим образом:

    driver.getDevTools().createSession();
    driver.getDevTools().send(new Command("Profiler.enable", ImmutableMap.of()));
    driver.getDevTools().send(new Command("Profiler.start", ImmutableMap.of()));
    //register to profiler events
    driver.getDevTools().addListener(new Event("Profiler.consoleProfileStarted", ConsoleProfileStarted.class), new Consumer<Object>() {
        @Override
        public void accept(Object o) {
            //do something
        }
    });

Примечание: до тех пор, пока домен Profiler не будет добавлен в Java-клиент Selenium, вам нужно будет предоставить свой Mapper.


Получить домен

Fetch Domain позволит клиентам заменять сетевой уровень браузера клиентским кодом.

  • Методы Fetch Domain следующие:

    • Fetch.disable: Отключает выборку домена.
    • Fetch.enable: Разрешает отправку событий requestPaused. Запрос будет приостановлен до тех пор, пока клиент не вызовет один из failRequest, performRequest или continueRequest / continueWithAuth.
    • Fetch.failRequest: Вызывает сбой запроса по указанной причине.
    • Fetch.fulfillRequest: Предоставляет ответ на запрос.
    • Fetch.continueRequest: Продолжает запрос, при необходимости изменяя некоторые его параметры.
    • Fetch.continueWithAuth: Продолжает отправку запроса authChallengeResponse после события authRequired.
    • Fetch.getResponseBody: Вызывает получение тела ответа от сервера и его возврат в виде одной строки. Может быть выдан только для запроса, который приостановлен на этапе ответа и является взаимоисключающим с takeResponseBodyForInterceptionAsStream. Вызов других методов, которые влияют на запрос, или отключение домена выборки до получения тела приводит к неопределенному поведению.
    • Fetch.takeResponseBodyAsStream: Возвращает дескриптор потока, представляющего тело ответа. Запрос должен быть приостановлен на этапе HeadersReceived. Обратите внимание, что после этой команды запрос не может быть продолжен как есть - клиенту необходимо либо отменить его, либо предоставить тело ответа. Поток поддерживает только последовательное чтение, IO.read завершится ошибкой, если позиция указана. Этот метод является взаимоисключающим с getResponseBody. Вызов других методов, которые влияют на запрос, или отключение домена выборки до получения тела приводит к неопределенному поведению.
  • События Fetch Domain следующие:

    • Fetch.requestPaused: Выдается, когда домен включен и URL-адрес запроса соответствует указанному фильтру. Запрос приостанавливается до тех пор, пока клиент не ответит одним из вариантов continueRequest, failRequest или fillRequest. Стадия запроса может быть определена наличием responseErrorReason и responseStatusCode - запрос находится на стадии ответа, если одно из этих полей присутствует, и на стадии запроса в противном случае.
    • Fetch.authRequired: Выдается, когда домен включен, когда для handleAuthRequests установлено значение true. Запрос приостанавливается до тех пор, пока клиент не ответит с continueWithAuth.

Ссылки

Вы можете найти пару ярких дискуссий в:

Другие вопросы по тегам