【问题标题】:How to use Chrome DevTools protocol in Selenium (using Python) for capturing HTTP requests and responses?如何在 Selenium 中使用 Chrome DevTools 协议(使用 Python)来捕获 HTTP 请求和响应?
【发布时间】:2020-04-12 16:28:42
【问题描述】:

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

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

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

【问题讨论】:

  • 我不确定它是否可以完成。无论如何,大多数请求仍将使用 xhr 而不是 fetch。

标签: selenium google-chrome-devtools fetch-api chrome-devtools-protocol selenium4


【解决方案1】:

是的,你没看错。

根据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 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 Domain 事件如下:

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

参考文献

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

【讨论】:

  • 4.0 目前仍处于测试阶段,因此如果您使用的是 Senium 3.0,则可以尝试记录性能。相关答案:stackoverflow.com/a/68363046/8491363
  • 如何选择这个作为正确答案?问题问“使用python”,但答案在java中。
猜你喜欢
  • 2020-09-26
  • 1970-01-01
  • 2021-12-09
  • 2020-01-11
  • 2012-08-12
  • 2015-09-21
  • 2014-12-16
  • 2015-06-22
相关资源
最近更新 更多