javascript - 如何用所有 cookie 重新创建一个页面?

标签 javascript puppeteer

我正在尝试:

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

我尝试过的实现如下:

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();
  1. createSession 用于捕获加载页面的 cookie。
  2. useSession 应使用现有 cookie 加载页面。

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

最佳答案

看起来 page#cookies 返回一些带有 session=true,expires=0 配置的 cookie。 setCookie 忽略这些值。

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

const cookies = await page.cookies();

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

在撰写此答案时,session 属性未记录在案。引用以下issue https://github.com/GoogleChrome/puppeteer/issues/980 .

关于javascript - 如何用所有 cookie 重新创建一个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46631333/

相关文章:

testing - Puppeteer Chromium,禁用 "Anonymize local IPs exposed by WebRTC"

javascript - 如何在jquery中的选择列表上按Enter键后运行一个函数

java - 从网页中的 java servlet 检索数据

javascript - 在没有jquery的情况下使用javascript隐藏多个tr,div

javascript - Puppeteer:如何将对象传递给 page.evaluate?

javascript - puppeteer 师(在 Heroku 上): how to prevent hanging Chromium processes?

javascript - HTML - 没有绝对定位的 Div 到底部

javascript - $ 无法在 Typo3 中包含的外部 js 文件中工作

javascript - 在 Puppeteer 中将类作为参数传递给 page.evaluate

javascript - 将 Network.requestIntercepted 与 Puppeteer 结合使用