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

8

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

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

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


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

3
是的,你看得没错。
根据 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.

所以已经准备好与一起使用,这将允许工具对Chromium、Chrome和其他基于Blink的浏览器进行仪器化、检查、调试和分析。在使用Selenium Webdriver控制Chrome Devtools的讨论中,@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
        }
    });

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

获取域名

获取域名 将使客户端能够用客户端代码替换浏览器的网络层。

Fetch域的方法如下:
- Fetch.disable:禁用fetch域。 - Fetch.enable:启用请求暂停事件。请求将暂停,直到客户端调用failRequest、fulfillRequest或continueRequest/continueWithAuth之一。 - Fetch.failRequest:导致请求失败,并指定原因。 - Fetch.fulfillRequest:提供请求的响应。 - Fetch.continueRequest:继续请求,可选择修改其某些参数。 - Fetch.continueWithAuth:在authRequired事件后继续请求并提供authChallengeResponse。 - Fetch.getResponseBody:从服务器接收响应体并作为单个字符串返回。仅适用于暂停在响应阶段的请求,与takeResponseBodyForInterceptionAsStream互斥。在接收到响应体之前调用影响请求的其他方法或禁用fetch域会导致未定义的行为。 - Fetch.takeResponseBodyAsStream:返回表示响应体的流的句柄。请求必须在HeadersReceived阶段暂停。请注意,在此命令之后,请求无法继续--客户端需要取消它或提供响应体。该流仅支持顺序读取,如果指定了位置,则IO.read将失败。此方法与getResponseBody互斥。在接收到响应体之前调用影响请求的其他方法或禁用fetch域会导致未定义的行为。
Fetch域的事件如下:
- Fetch.requestPaused:当启用域并且请求URL与指定的过滤器匹配时发出。请求将暂停,直到客户端使用continueRequest、failRequest或fulfillRequest之一做出响应。可以通过存在responseErrorReason和responseStatusCode字段来确定请求的阶段--如果这些字段中的任何一个存在,则请求处于响应阶段,否则处于请求阶段。 - Fetch.authRequired:当启用域并且handleAuthRequests设置为true时发出。请求将暂停,直到客户端使用continueWithAuth做出响应。

参考文献

您可以在以下讨论中找到一些相关内容:


截至目前,4.0仍处于测试版阶段,因此如果您正在使用Senium 3.0,可以尝试记录性能。相关答案:https://dev59.com/amIj5IYBdhLWcg3wTTgG#68363046 - user8491363
2
这怎么被选为正确答案的?问题是“使用Python”,但答案却是Java。 - Emre Bayram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接