如何重新创建包含所有Cookie的页面?

Gaj*_*jus 3 javascript puppeteer

我在尝试着:

  1. 访问初始化会话的页面
  2. 将会话存储在JSON对象中
  3. 访问同一页面,现在应该识别现有会话

我尝试的实现如下:

import puppeteer from 'puppeteer';

const createSession = async (browser, startUrl) => {
  const page = await browser.newPage();

  await page.goto(startUrl);

  await page.waitForSelector('#submit');

  const cookies = await page.cookies();
  const url = await page.url();

  return {
    cookies,
    url
  };
};

const useSession = async (browser, session) => {
  const page = await browser.newPage();

  for (const cookie of session.cookies) {
    await page.setCookie(cookie);
  }

  await page.goto(session.url);
};

const run = async () => {
  const browser = await puppeteer.launch({
    headless: false
  });

  const session = await createSession(browser, 'http://foo.com/');

  // The session has been established
  await useSession(browser, session);
  await useSession(browser, session);
};

run();
Run Code Online (Sandbox Code Playgroud)
  1. createSession 用于捕获加载页面的cookie.
  2. useSession 应使用现有的cookie加载页面.

但是,这不起作用 - session.url页面无法识别会话.似乎并非所有cookie都以这种方式被捕获.

Gaj*_*jus 7

似乎page#cookies返回一些session=true,expires=0配置的cookie .setCookie忽略这些价值观.

我通过构建一个覆盖expiressession属性的新cookie数组来解决这个问题.

const cookies = await page.cookies();

const sessionFreeCookies = cookies.map((cookie) => {
  return {
    ...cookie,
    expires: Date.now() / 1000 + 10 * 60,
    session: false
  };
});
Run Code Online (Sandbox Code Playgroud)

在撰写此答案时,session财产没有记录.请参阅以下问题https://github.com/GoogleChrome/puppeteer/issues/980.