首页 > 解决方案 > 如何在没有硒的情况下使用 python 读取 chrome 控制台?

问题描述

我想使用 Python3 阅读 chrome 的 js 控制台,而不需要任何 web 驱动程序,例如 selenium(机器人检测和东西)。

我已经尝试过 Chrome DevTools 协议 python 库,例如 chromewhip、pychrome 和 PyChromeDevTools,但我无法从控制台读取任何数据。

我想阅读 Runtime.consoleAPICalled 或 Log.entryAdded,但我不知道如何实现这些回调,因为这些库的文档没有指定任何内容。也没有找到任何例子。

有谁知道如何正确访问这些事件或提供它的其他库?

标签: pythonpython-3.xgoogle-chromegoogle-chrome-devtoolschrome-devtools-protocol

解决方案


我想阅读 Runtime.consoleAPICalled 或 Log.entryAdded,但我不知道如何实现这些回调

以下假设(根据您的问题措辞)您能够在对 Web 调试器端点开放的流上发送和接收调试协议消息。

在您发送调试协议消息Runtime.enableLog.enable消息后,Runtime.consoleAPICalledLog.entryAdded要查找的“事件”由您在同一调试通道上收到的消息表示。

您可能需要通过检查接收到的事件消息中的字段来将控制台事件消息与执行上下文(在Runtime.enable响应中看到)进行匹配。executionContextId日志事件不与任何单个执行上下文相关联。所有这些“事件”消息都会有Id=0,这有助于识别它们是“事件”消息而不是响应消息。

以下是从 Chrome 收到的一些示例消息(格式为 JSON,具有任意字段顺序):

控制台 API 事件消息:

{
    "method": "Runtime.consoleAPICalled",
    "params": 
    {
        "type": "warning",
        "args": [
          {  "type": "string",
            "value": "Google Maps JavaScript API warning: NoApiKeys https://developers.google.com/maps/documentation/javascript/error-messages#no-api-keys"
           }],
         "executionContextId": 1,
         "timestamp": 1618949706735.553,
         "stackTrace": 
         {
              "callFrames": [
                {
                  "functionName": "TA.j",
                  "scriptId": "206",
                  "url": "https://maps.googleapis.com/maps-api-v3/api/js/44/10/util.js",
                  "lineNumber": 228,
                  "columnNumber": 26
                } ]
          }
       }
    },
    "id": 0
}

记录事件消息:

{
   "method":"Log.entryAdded",
   "params":
   {
      "entry":
      {
          "source":"javascript",
          "level":"warning",
          "text":"The deviceorientation events are blocked by permissions policy. See https://github.com/w3c/webappsec-permissions-policy/blob/master/features.md#sensor-features",
          "timestamp":1.6189509536801208e+12
      }
   },
   "id": 0
}

推荐阅读