Странное поведение локального хранилища с Puppeteer - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь сохранить localStorage в переменной за пределами page.evaluate ().Но, похоже, я не могу этого сделать.Ниже приведен код, который я пытаюсь использовать, и выходные данные consloe.log (), как я могу заставить его работать и сохранять localStorage в переменной?Внутри обратного вызова я вижу localStorage, но он не действует как обычно, так как getItem не работает.

Я пытаюсь получить данные несколькими способами, но ни один из них не работает ... есть идеи почему?

await page.click("[id=Login-button]");

let savedLocalStorage = "";

const result = await page.evaluate(savedLocalStorage => {
console.log(localStorage); //output: {AUTH: 12345}

console.log(localStorage.key(0)); //output: null

console.log(localStorage.getItem("AUTH")); //output: null

localStorage.setItem("Test", "1234"); //working

console.log(localStorage); //output: {AUTH: 12345, Test: 1234}

savedLocalStorage = localStorage;

//savedLocalStorage = localStorage.AUTH; - same result as savedLocalStorage = localStorage;

return localStorage;
}, savedLocalStorage);

console.log(savedLocalStorage); //output: ""

console.log(result); //output: {}

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Прежде всего, вы не сможете передать savedLocalStorage в качестве ссылки.Скрипт внутри evaluate получит сериализованную копию этой переменной.

Относительно result.Puppetter не вернет сериализованное localStorage, а будет указатель (JSHandle) на объект внутри браузера.По сути, это объект кукловода, который вы можете передать другой функции evaluate, в данном случае «в качестве ссылки».

Что вы можете сделать, это сериализовать localStorage и затем проанализировать его на другой стороне.

const result = await page.evaluate(() => {
  localStorage.setItem("Test", "1234"); //working
  return JSON.stringify(localStorage);
});

console.log(JSON.parse(result));
<!DOCTYPE html>
<html>
  <head>
    <title>console.log test</title>
  </head>
  <body>
    <script>
      localStorage.setItem("AUTH", 12345);
    </script>
  </body>
</html>
0 голосов
/ 28 февраля 2019

Попробуйте сериализовать данные:

    async function saveLocalStorage(page, filePath) {
      const json = await page.evaluate(() => {
        const json = {};
        for (const i = 0; i < localStorage.length; i++) {
          const key = localStorage.key(i);
          json[key] = localStorage.getItem(key);
        }
        return json;
      });
      fs.writeFileSync(filePath, 'utf8', JSON.stringify(json));
    }

    async function restoreLocalStorage(page, filePath) {
      const json = JSON.parse(fs.readFileSync(filePath, 'utf8'));
      await page.evaluate(json => {
        localStorage.clear();
        for (let key in json)
          localStorage.setItem(key, json[key]);
      }, json);
    }

https://github.com/GoogleChrome/puppeteer/issues/727

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...