我展示了我的完整代码,如果有帮助的话。我添加了下划线以获取请求URL,谢谢。
import _, { map } from 'underscore';
var currentTab;
var version = "1.0";
chrome.tabs.onActivated.addListener(activeTab => {
currentTab&&chrome.debugger.detach({tabId:currentTab.tabId});
currentTab = activeTab;
chrome.debugger.attach({
tabId: currentTab.tabId
}, version, onAttach.bind(null, currentTab.tabId));
});
function onAttach(tabId) {
chrome.debugger.sendCommand({
tabId: tabId
}, "Network.enable");
chrome.debugger.onEvent.addListener(allEventHandler);
}
function allEventHandler(debuggeeId, message, params) {
if (currentTab.tabId !== debuggeeId.tabId) {
return;
}
if (message === "Network.responseReceived") {
chrome.debugger.sendCommand({
tabId: debuggeeId.tabId
}, "Network.getResponseBody", {
"requestId": params.requestId
}, _.partial(function(response,params) {
console.log(response.body,params.response.url);
},_,params));
}
}
我还发现chrome.debugger.sendCommand存在一个bug。如果我有两个请求的URI相同但参数不同,例如:
第二个请求将无法获得正确的responseBody,它会显示:
Chrome Extension: "Unchecked runtime.lastError: {"code":-32000,"message":"No resource with given identifier found"}
但是我直接在后台开发工具中调试时,它获取了第二个正确的正文。
chrome.debugger.sendCommand({tabId:2},"Network.getResponseBody",{requestId:"6932.574"},function(response){console.log(response.body)})
所以tabId和requestId没有问题。
然后我用setTimeout包装chrome.debugger.sendCommand,它将正确地获取第一个和第二个responseBody。
if (message === "Network.responseReceived") {
console.log(params.response.url,debuggeeId.tabId,params.requestId)
setTimeout(()=>{
chrome.debugger.sendCommand({
tabId: debuggeeId.tabId
}, "Network.getResponseBody", {
"requestId": params.requestId
}, _.partial(function(response,params,debuggeeId) {
console.log(response.body,params.response.url);
},_,params,debuggeeId));
},800)
}
我认为setTimeout不是完美的解决方案,有人能提供帮助吗?
谢谢。