2017-10-08 26 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

相關問題