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

问题描述 投票:0回答:1

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

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

但是我不知道如何处理requestPaused事件(我需要调用一个fulfillRequestcontinueRequest / continueWithAuth)。结果,我的程序停止工作。如果有人可以提供示例帮助我理解它的工作原理,我对此深表感谢。

selenium google-chrome-devtools fetch-api chrome-devtools-protocol selenium4
1个回答
0
投票

,您看对了。

根据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的浏览器。在讨论中Controlling Chrome Devtools with Selenium Webdriver @AdiOhana提到了Profiler Domain中的一些命令的示例用法,如下所示:

    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.disable:禁用获取域。
    • Fetch.enable:启用发布requestPaused事件。一个请求将被暂停,直到客户端调用failRequest,fulfillRequest或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响应。

参考

您可以在以下位置找到一些有趣的讨论:

© www.soinside.com 2019 - 2024. All rights reserved.