3

我知道下面的代码片段可以让我读取所有当前的 cookie:

let Main = await import('./main/main.js');
await Main.MainImpl.sendOverProtocol('Network.getCookies');

预览 Network.getCookies

现在,出于测试目的,我需要获取所有可用LocalStorage条目。我尝试了一些东西,但不幸的是我没有得到它。Chrome DevTools 本身只使用已经可用的securityOrigin变量查询它,我不知道它是从哪里获取的:

CDP 获取DOMStorageItems

我也发现Page.getFrameTree但缺少一些条目 - 所以我认为这与以下条目无关LocalStorage

本地存储视图

我缺少的文档中还有其他方法吗?

编辑#1

正如评论中提到的,我得到了它的使用Page.getResourceTree。不幸的是,我得到的下一个问题如下:

Protocol error (DOMStorage.getDOMStorageItems): Frame not found for the given security origin.
4

3 回答 3

1

这够了吗?

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('http://example.org/');

    await page.evaluate(() => { window.localStorage.setItem('foo', 42); });

    const cdp = await page.target().createCDPSession();

    const data = await cdp.send('DOMStorage.getDOMStorageItems', {
      storageId: {
        securityOrigin: await page.evaluate(() => window.origin),
        isLocalStorage: true,
      },
    });
    console.log(data);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

输出:

{ entries: [ [ 'foo', '42' ] ] }
于 2020-06-13T08:10:56.583 回答
0

Puppeteer 可能会打开一个空白的 chromium 选项卡,因此您可能会得到错误的框架网址,例如 about:blank 或空网址。

我设法通过添加两个简单的检查来绕过这个错误:

      if (!frame.url()) {
        continue;
      }

      if (frame.url() === 'about:blank') {
        continue;
      }

似乎也有一些不好的网址,例如:

铬错误://chromewebdata/

于 2020-09-02T10:09:32.283 回答
0

我使用以下代码:

getLocalStorage = async function(page, data = {}) {
  // based on https://stackoverflow.com/a/54355801/1407622
  const client = page._client;
  for (const frame of page.frames()) {
    // it is unclear when the following url values occur:
    // potentially about:blank is the frame before the very first page is browsed
    if(!frame.url().startsWith('http')) continue; // filters chrome-error://, about:blank and empty url

    const securityOrigin = new url.URL(frame.url()).origin;
    const response = await client.send('DOMStorage.getDOMStorageItems',
      { storageId: { isLocalStorage: true, securityOrigin } },
    );
    if (response.entries.length > 0) {
      let entries = {};
      for (const [key,val] of response.entries) {
        entries[key] = {
          value: safeJSONParse(val),
        };
      }
      // console.log(response.entries);
      data[securityOrigin] = Object.assign({}, data[securityOrigin], entries);
    }
  }
  return data;
};

来源:https
://github.com/EU-EDPS/website-evidence-collector/blob/master/lib/tools.js 原始 SA 来源:使用 Puppeteer 从 localStorage 获取所有值

但是,有时我会收到相同的错误:“找不到给定安全来源的框架”

于 2020-08-26T10:27:06.710 回答