Как использовать протокол 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.
Ссылки
Вы можете найти пару ярких дискуссий в: