无法获取shadowRootPushed CDP事件

问题描述 投票:0回答:1

我试图让 CDP 发送

DOM.shadowRootPushed
事件(实验性的),但它从来没有起作用。

我使用标志

--remote-debugging-port=2222
启动了 Chrome,连接到它,并发送
DOM.enable
来启用 DOM 域处理程序。

import WebSocket from 'ws';

async function connectToChrome() {
    const response = await fetch('http://localhost:2222/json');
    const endpoints = await response.json();

    let debuggerUrl = '';
    for (const i in endpoints) {
      if (endpoints[i].title === 'Simple html') {
        debuggerUrl = endpoints[i].webSocketDebuggerUrl;
      }
    }

    console.log('debuggerUrl', debuggerUrl);

    const ws = new WebSocket(debuggerUrl);

    ws.on('open', () => {
        console.log('Connected to Chrome');
        
        ws.send(JSON.stringify({
            id: 1,
            method: 'DOM.enable'
        }));
    });

    ws.on('message', (data) => {
        const message = JSON.parse(data);
        if (true) {
            console.log('Message received:', message);
        }
    });

    ws.on('error', (error) => {
        console.error('WebSocket error:', error);
    });
}

connectToChrome();

我有一个简单的 HTML 页面,单击按钮时会调用

attachShadow
-

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Simple html</title>
    <script>
        function test() {
            const dummy = document.getElementById('dummy');
            let shadowRoot = dummy.attachShadow({ mode: 'open' });
            const paragraph = document.createElement('p');
            paragraph.textContent = 'This content is encapsulated.';
            shadowRoot.appendChild(paragraph);
        }
    </script>
</head>

<body>
    <div id="dummy">
        <button onclick="test()">Click me</button>
    </div>
</body>

</html>

其他一些细节:

  1. 当我在 Devtools 中启用“协议监视器”时,我看到
    DOM.shadowRootPushed
    事件,所以看起来 HTML 没问题。
  2. 即使在没有标志的 Chrome 浏览器上,该事件仍然显示在协议监视器中,因此我猜测此事件不需要特殊的 Chrome 标志。
  3. 当我重新加载 HTML 页面时,我收到
    DOM.documentUpdated
    事件,这意味着 DOM 域处理程序必须正在运行。

我想知道是否需要发送其他一些 CDP 命令才能完成这项工作,但我找不到任何相关信息。

google-chrome google-chrome-devtools chrome-devtools-protocol
1个回答
0
投票

终于成功了,只需要这1个命令-

    ws.send(JSON.stringify({
      id: 1,
      method: 'DOM.getDocument',
      params: { depth: -1, pierce: true }
    }));

DOM.enable
都不需要。

DOM.getDocument
的文档说-

Returns the root DOM node (and optionally the subtree) to the caller. Implicitly enables the DOM domain events for the current target.

我假设

DOM.enable
是启用 DOM 域事件的显式方式,所以我一直调用它,但看起来
DOM.getDocument
很特殊。不确定这是否是一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.