如何在 Selenium(使用 Python)中使用 Chrome DevTools 协议来捕获 HTTP 请求和响应?

nxb*_*bit 10 selenium google-chrome-devtools fetch-api chrome-devtools-protocol selenium4

我知道它Fetch Domain用于此目的,但我不知道如何准确地实现它。在 Selenium python 中,我使用以下代码来启用requestPaused事件的发出。

driver.execute_cdp_cmd("Fetch.enable",{})
driver.get('https://www.example.com')
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理requestPaused事件(我需要调用 1fulfillRequestcontinueRequest/ continueWithAuth)。结果,我的程序停止工作。如果有人能为我提供一个例子来帮助我理解它是如何工作的,我真的很感激。

Deb*_*anB 3

是的,你没看错。

根据Selenium v​​4.0.0-alpha-3的发行说明:

* Expose devtools APIs from chromium derived drivers.
* Expose presence of devtools support on a role-based interface
Run Code Online (Sandbox Code Playgroud)

根据Selenium v​​4.0.0.0-alpha-1的发行说明:

* Basic support for CDP landed via the "DevTools" interface.
Run Code Online (Sandbox Code Playgroud)

因此,一起使用,这将允许使用工具来检测、检查、调试和分析 Chromium、Chrome 和其他基于 Blink 的浏览器。在使用 Selenium Webdriver 控制 Chrome Devtools 的讨论中@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
        }
    });
Run Code Online (Sandbox Code Playgroud)

注意:在 Profiler 域添加到 Selenium java 客户端之前,您必须提供您的 Mapper。


获取域名

Fetch Domain将使客户端能够用客户端代码替换浏览器的网络层。

  • 获取域名的方法如下:

    • Fetch.disable:禁用获取域。
    • Fetch.enable:启用 requestPaused 事件的发出。请求将暂停,直到客户端调用failRequest、fullRequest 或 continueRequest/continueWithAuth 之一。
    • Fetch.failRequest:导致请求因指定原因失败。
    • Fetch.fulfillRequest:提供对请求的响应。
    • Fetch.continueRequest:继续请求,可以选择修改其某些参数。
    • Fetch.continueWithAuth:在 authRequired 事件之后继续提供 authChallengeResponse 的请求。
    • Fetch.getResponseBody:导致从服务器接收响应正文并作为单个字符串返回。只能针对在 Response 阶段暂停的请求发出,并且与 takeResponseBodyForInterceptionAsStream 互斥。在接收正文之前调用影响请求的其他方法或禁用获取域会导致未定义的行为。
    • Fetch.takeResponseBodyAsStream:返回表示响应正文的流的句柄。请求必须在 HeadersReceived 阶段暂停。请注意,在此命令之后,请求无法按原样继续 - 客户端需要取消它或提供响应正文。该流仅支持顺序读取,如果指定位置,IO.read 将失败。此方法与 getResponseBody 互斥。在接收正文之前调用影响请求的其他方法或禁用获取域会导致未定义的行为。
  • 获取域事件如下:

    • Fetch.requestPaused:当域已启用并且请求 URL 与指定的过滤器匹配时发出。请求将暂停,直到客户端使用 continueRequest、failRequest 或fulfillRequest 之一进行响应。请求的阶段可以通过responseErrorReason 和responseStatusCode 的存在来确定——如果这些字段中的任何一个存在,则请求处于响应阶段,否则处于请求阶段。
    • Fetch.authRequired:在启用域并将handleAuthRequests 设置为true 时发出。请求将暂停,直到客户端使用 continueWithAuth 进行响应。

参考

您可以在以下位置找到一些相关的讨论:

  • 如何选择这个作为正确答案?问题问“使用python”,但答案是java。 (2认同)

归档时间:

查看次数:

10562 次

最近记录:

6 年,5 月 前