Ord*_*nge 9 javascript chrome-devtools-protocol
在 chrome devtools 的控制台中,顶部有一个下拉菜单,用于选择执行上下文。
更改执行上下文会更改可用的全局变量以及任何调用 .js 的控制台可以访问的内容
我正在尝试使用 Runtime.evaluate函数通过 ChromeDevtools 协议运行一些 javascript,并且我需要在工作上下文中运行它。
检查CDP 文档,我发现它Runtime.evaluate需要一个参数ExecutionContextId。我最初假设通过 DevTools 窗口下拉菜单的执行上下文与此参数相同。我弄清楚如何获取当前 的列表的唯一方法ExecutionContextId是订阅事件,Runtime.executionContextCreated然后执行 a ,然后执行Runtime.disablea Runtime.enable,这会导致ExecutionContextDiscription事件处理程序为每个加载的上下文接收 an 。
然而,在查看ExecutionContextDescription返回的 后,有些与下拉列表中的匹配,但描述工作线程的执行上下文永远不会返回。
如何通过 CDP 在工作执行上下文中执行 js,就像在 ChromeDevtools 窗口中轻松完成的那样?
虽然我没有找到使用执行上下文来完成此操作的方法,但我能够通过以下过程实现最终游戏。
TargetID获取可能的列表Target.attachToTarget记下sessionId返回的步骤 1 有多种方法,这里的每个附加步骤可能需要在不同的情况下应用。
Target.getTargets可能返回感兴趣目标的调用targetCreated事件并调用Target.setDiscoverTargetsTarget.setAutoAttach(true, false)在第 2 步之前调用Target.setAutoAttach(false, false)在第3步之前调用在我在这里的测试中,感兴趣的工作人员没有通过方法 1 出现,但确实出现在方法 2 中,在其他情况下,我需要所有 4 个步骤才能正确触发事件处理程序。我不知道为什么会有差异。
文档中提到的“平面模式”基本上是包含的任何 CDP 命令sessionId。例如
{"method": "Domain.method", "params": {"method params"}, "sessionId": "12345"}
感谢 Puppeteer 及其日志帮助我破译了整个过程。