DevToolsProtocol、Runtime.evaluate 根据工作线程执行上下文

Ord*_*nge 9 javascript chrome-devtools-protocol

在 chrome devtools 的控制台中,顶部有一个下拉菜单,用于选择执行上下文。

以下是访问www.google.com时的示例

在此输入图像描述

更改执行上下文会更改可用的全局变量以及任何调用 .js 的控制台可以访问的内容

我正在尝试使用 Runtime.evaluate函数通过 ChromeDevtools 协议运行一些 javascript,并且我需要在工作上下文中运行它。

检查CDP 文档,我发现它Runtime.evaluate需要一个参数ExecutionContextId。我最初假设通过 DevTools 窗口下拉菜单的执行上下文与此参数相同。我弄清楚如何获取当前 的列表的唯一方法ExecutionContextId是订阅事件,Runtime.executionContextCreated然后执行 a ,然后执行Runtime.disablea Runtime.enable,这会导致ExecutionContextDiscription事件处理程序为每个加载的上下文接收 an 。

然而,在查看ExecutionContextDescription返回的 后,有些与下拉列表中的匹配,但描述工作线程的执行上下文永远不会返回。

如何通过 CDP 在工作执行上下文中执行 js,就像在 ChromeDevtools 窗口中轻松完成的那样?

Ord*_*nge 1

虽然我没有找到使用执行上下文来完成此操作的方法,但我能够通过以下过程实现最终游戏。

  1. TargetID获取可能的列表
  2. 连接到感兴趣的目标并Target.attachToTarget记下sessionId返回的
  3. 在“平面模式”中调用感兴趣的 CDP 方法

步骤 1 有多种方法,这里的每个附加步骤可能需要在不同的情况下应用。

  1. Target.getTargets可能返回感兴趣目标的调用
  2. 挂钩targetCreated事件并调用Target.setDiscoverTargets
  3. Target.setAutoAttach(true, false)在第 2 步之前调用
  4. Target.setAutoAttach(false, false)在第3步之前调用

在我在这里的测试中,感兴趣的工作人员没有通过方法 1 出现,但确实出现在方法 2 中,在其他情况下,我需要所有 4 个步骤才能正确触发事件处理程序。我不知道为什么会有差异。

文档中提到的“平面模式”基本上是包含的任何 CDP 命令sessionId。例如

{"method": "Domain.method", "params": {"method params"}, "sessionId": "12345"}

感谢 Puppeteer 及其日志帮助我破译了整个过程。