5

I want to copy all network responses from the filtered list of requests from the network tab under Chrome's devtools.

I read about the solution of copy all requests' URLs at Multiple URLs copy in Sources/Network tab But I can't figure out how to access the decoded response body from requests.

The solution at Chrome Devtools: Save specific requests in Network Tab works, but I want a solution that only extracts responses from the filtered request list under the network tab.

Kai
  • 61
  • 1
  • 2
  • I found out about "static async _copyResponse(request)" function from https://chromium.googlesource.com/chromium/src/third_party/+/master/blink/renderer/devtools/front_end/network/NetworkLogView.js?autodive=0%2F I can get a network request from devtools for devtools(https://stackoverflow.com/questions/41200450/multiple-urls-copy-in-sources-network-tab?newreg=7d6ffd5426924800842f5b4594d3cdc0): request = UI.panels.network._networkLogView._dataGrid._rootNode._flatNodes[0]._request But "UI.panels.network._networkLogView" has no function of _copyResponse. – Kai Sep 03 '19 at 04:18
  • I haven't found an answer yet. – Kai Sep 04 '19 at 06:05
  • Does this answer your question? [Multiple URLs copy in Sources/Network tab](https://stackoverflow.com/questions/41200450/multiple-urls-copy-in-sources-network-tab) – Elisha Habinsky May 08 '20 at 03:56

2 Answers2

8

Inspecting the source code of devtools reveals we need contentData() method.

The how-to-use instructions are the same as in Multiple URLs copy in Sources/Network tab.

await (async () => {
  const getContent = r => r.url() && !r.url().startsWith('data:') && r.contentData();
  const nodes = UI.panels.network.networkLogView.dataGrid.rootNode().flatChildren();
  const requests = nodes.map(n => n.request());
  const contents = await Promise.all(requests.map(getContent));
  return contents.map((data, i) => {
    const r = requests[i];
    const url = r.url();
    const body = data?.content;
    const content = !data ? url :
      r.contentType().isTextType() ? data :
        typeof body !== 'string' ? body :
          `data:${r.mimeType}${data.encoded ? ';base64' : ''},${body}`;
    return {url, content};
  });
})();

Tested in Chrome 111. For older versions of Chrome see the revisions of this answer.

wOxxOm
  • 65,848
  • 11
  • 132
  • 136
0

Update of @wOxxOm's excellent answer but for 2023:

(async () => {
  const getContent = r => r.url() && !r.url().startsWith('data:') && r.contentData();
  const nodes = UI.panels.network.networkLogView.dataGrid.rootNode().flatChildren();
  const requests = nodes.map(n => n.request());
  const contents = await Promise.all(requests.map(getContent));
  const looks = contents.map((data, i) => {
    const r = requests[i];
    const url = r.url();
    const content = !data ? 'data is encoded inside the data url already, duh' :
      r.contentType().isTextType() ? data :
        Common.ContentProvider.contentAsDataURL(data, r.mimeType, r.contentEncoded());
    return {url, content};
  });
  console.log(looks);
})();

Ran via the console when you're inspecting (CTRL+SHIFT+I) a popped out inspector window on the network tab. That's right, meta-inspection! CTRL+SHIFT+I