2017-10-08 63 views
1

我想:如何用所有的cookies重新创建页面?

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

但是,这不起作用 - session.url页面无法识别会话。看起来并不是所有的cookies都以这种方式被捕获。

回答

4

看来,page#cookies返回一些饼干与session=true,expires=0配置。 setCookie忽略这些值。

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

const cookies = await page.cookies(); 

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

当时写这个答案,session属性不记录。请参阅以下问题https://github.com/GoogleChrome/puppeteer/issues/980