Javascript 如何使用所有cookie重新创建页面?

Javascript 如何使用所有cookie重新创建页面?,javascript,puppeteer,Javascript,Puppeteer,我正在努力: 访问初始化会话的页面 将会话存储在JSON对象中 访问同一页面,该页面现在应该可以识别现有会话 我尝试的实现如下: import puppeteer from 'puppeteer'; const createSession = async (browser, startUrl) => { const page = await browser.newPage(); await page.goto(startUrl); await page.waitForSe

我正在努力:

  • 访问初始化会话的页面
  • 将会话存储在JSON对象中
  • 访问同一页面,该页面现在应该可以识别现有会话
  • 我尝试的实现如下:

    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();
    
  • createSession
    用于捕获加载页面的cookie
  • useSession
    将使用现有cookie加载页面
  • 但是,这不起作用,
    session.url
    页面无法识别该会话。似乎并非所有cookie都是通过这种方式捕获的。

    似乎
    页面#cookies
    返回了一些cookie,其
    会话=true,过期=0
    配置
    setCookie
    忽略这些值

    我通过构建一个新的cookies数组来解决这个问题,该数组覆盖了
    expires
    session
    属性

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

    在编写此答案时,
    会话
    属性未被记录。请参阅以下问题。

    puppeter
    page.cookies()
    方法仅获取当前页面域的cookies。然而,在某些情况下,它也可能拥有来自不同域的cookie

    您可以调用内部方法
    Network.getAllCookies
    从所有域获取Cookie

    (async() => {
      const browser = await puppeteer.launch({});
      const page = await browser.newPage();
      await page.goto('https://stackoverflow.com', {waitUntil : 'networkidle2' });
    
      // Here we can get all of the cookies
      console.log(await page._client.send('Network.getAllCookies'));
    
    })();
    
    这里有更多关于这条线的信息-