javascript - 连接调试器时 Electron BrowserWindow 无法获得响应

标签 javascript electron google-chrome-devtools chrome-devtools-protocol

我正在编写一个 Electron 应用程序,它创建一个 BrowserWindow。我想捕获发送到服务器的一些请求,我还想要这些请求的响应。使用 Electron WebRequest api 我无法获得响应,因此搜索网络并发现我可以通过编程方式附加调试器。

我使用下面的代码附加调试器,并且几乎正确地得到了所有响应。但对于一个更大的请求,我无法得到答复。我收到错误

Error: No resource with given identifier found

如果我启动 DevTools 并导航到该请求,我也无法获得响应:无法加载响应数据。如果我注释掉下面的代码,DevTools 中的响应将正确显示。

请注意,这种情况仅发生在一个特定请求上,该请求会返回大约 1MB 的响应。对于所有其他请求,我可以使用 getResponseData() 获取响应。

const dbg = win.webContents.debugger

var getResponseData = async (reqId) => {
    const res = await dbg.sendCommand("Network.getResponseBody", {requestId: reqId});
    return res.body
}

try {
    dbg.attach('1.3')
    dbg.sendCommand('Network.enable')
} catch (err) {
    console.log('Debugger attach failed : ', err)
}

dbg.on('detach', async (event, reason) => {
    console.log('Debugger detached due to : ', reason)
})

dbg.on('message', (e, m, p) => {
    if (m === 'Network.requestWillBeSent') {
        if (p.request.url === someURL) {
            const j = JSON.parse(p.request.postData)
            console.log("req " + p.requestId)
            global.webReqs[p.requestId] = { reqData: j}
        }
    } else if (m === 'Network.loadingFinished') {
        if (p.requestId in global.webReqs) {
            console.log("res " + p.requestId)
            getResponseData(p.requestId).then(res => {
                console.log(res.slice(0,60))
            }).catch(err => {
                console.error(err)
            })
        }
    }
});

简短更新 此特定请求的事件堆栈如下,其中 13548.212 只是 requestId

Network.requestWillBeSentExtraInfo 13548.212
Network.requestWillBeSent 13548.212
Network.responseReceivedExtraInfo 13548.212
Network.responseReceived 13548.212
Network.dataReceived 13548.212 [repeated 135 times]
...
Network.loadingFinished 13548.212

最佳答案

看来我找到了解决方案。这只是一种解决方法,但它确实有效。我没有使用Network.getResponseBody。我使用了Fetch(https://chromedevtools.github.io/devtools-protocol/tot/Fetch)。

要使用该功能,需要订阅与模式匹配的响应。然后您可以对 Fetch.requestPaused 事件使用react。在此期间,您可以直接访问请求并间接访问响应。要获取响应,请使用正确的 requestId 调用 Fetch.getResponseBody。另请记住将 Fetch.continueRequest 发送为

The request is paused until the client responds with one of continueRequest, failRequest or fulfillRequest

https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#event-requestPaused

   dbg.sendCommand('Fetch.enable', {
            patterns: [
                { urlPattern: interestingURLpattern, requestStage: "Response" }
            ]})

   var getResponseJson = async (requestId) => {
         const res = await dbg.sendCommand("Fetch.getResponseBody", {requestId: requestId})
         return JSON.parse(res.base64Encoded ? Buffer.from(res.body, 'base64').toString() : res.body)
     }
    dbg.on('message', (e, m, p) => {
        if(m === 'Fetch.requestPaused') {
            var reqJson = JSON.parse(p.request.postData)
            var resJson = await getResponseJson(p.requestId)
            ...

            await dbg.sendCommand("Fetch.continueRequest", {requestId: p.requestId})
        }
    });

关于javascript - 连接调试器时 Electron BrowserWindow 无法获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66101799/

相关文章:

javascript - 使用 Next js 时在 CSS/SASS 模块中使用 kebab-case CSS 类名

electron - 如何从 Electron 获取原生节点模块? ref 和 ffi 模块出现错误

node.js - Angular2 内部的 Node 和 Electron 模块

javascript - 我可以在不设置断点的情况下单步执行浏览器正在解析的所有 JavaScript 代码吗?

javascript - 在 Chrome Devtools 中调试 Javascript 时,遇到 DOM 断点后如何继续?

javascript - 动态限制iOS数字输入中的特殊字符

javascript - 添加新小部件后,Gridstack 小部件无法移动

javascript - 使用 mechanize 和 python 跟随 javascript 链接

javascript - Electron 应用程序在运行 Javascript 代码时停止渲染

javascript - Node --experimental-modules - 错误 : Cannot find module