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>
其他一些细节:
DOM.shadowRootPushed
事件,所以看起来 HTML 没问题。DOM.documentUpdated
事件,这意味着 DOM 域处理程序必须正在运行。我想知道是否需要发送其他一些 CDP 命令才能完成这项工作,但我找不到任何相关信息。
终于成功了,只需要这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
很特殊。不确定这是否是一个错误。