首页 > 解决方案 > 如何在 Selenium 中使用 Chrome DevTools 协议(使用 Python)来捕获 HTTP 请求和响应?

问题描述

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

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

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

标签: seleniumgoogle-chrome-devtoolsfetch-apichrome-devtools-protocolselenium4

解决方案


的,你没看错。

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

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

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

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

所以全部设置为可与一起使用,这将允许工具来检测、检查、调试和分析 Chromium、Chrome 和其他基于 Blink 的浏览器。在使用 Selenium Webdriver 控制 Chrome 开发工具的讨论中,@ 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 域添加到 Selenium java 客户端之前,您必须提供 Mapper。


获取域

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

  • Fetch Domain 方法如下:

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

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

参考

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


推荐阅读