首页 > 解决方案 > 节点 puppeteer 在最终页面着陆后生成 cookie(所有重定向完成后)

问题描述

我的 puppeteer 脚本登陆一页,但可能有一些内部重定向,我想在最后一页登陆后生成 cookie。所以我设置了一些等待超时,所以我可以确保我的页面已经登陆。

我还生成了屏幕截图,我看到了我的页面这是一个代码。有时它会生成错误的 cookie。

async function main(proxy) {

    let promiseArray = [];

    let chromeOptions = {
        headless: true,
        slowMo:10,
        defaultViewport: null,
        args: [
            `--proxy-server=${proxy}`,
        ]
    };

    const browser = await puppeteer.launch(chromeOptions);

    const page = await browser.newPage();

    let finalCookie = '';

    const userAgent = 'Mozilla/5.0 (X11; Linux x86_64)' +
        'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.39 Safari/537.36';

    // **This is page load event**
    promiseArray.push(new Promise(async function(resolve, reject) {
        await page.on('load', async function () {
            let cookies = await page.cookies();
            console.log("START==================================");

            console.log(await page.url());

            let cookieArray = [];

            cookies.forEach(function (item) {
                cookieArray.push(item.name + '='+item.value);
            });

            finalCookie = cookieArray.join(';');

            console.log('END');

            resolve();
        });
    }));


    await page.setUserAgent(userAgent);

    // const page = await browser.createIncognitoBrowserContext();
    await page.authenticate({ username: 'spopov', password: '68LYCfVy' });

    url = urls[Math.floor(Math.random() * urls.length)];

    await page.goto(url, {
        waitUntil: 'networkidle0',
        timeout: 0
    });

    let filename = 'screenshots/'+ proxy + '-1.png';

    try {
        await page.waitForSelector('#someid');
    } catch (e) {
        console.log("Error in cookie generation");
        await page.screenshot({path: filename});
    }

    await page.screenshot({path: filename});

    await timeout(3000);
    filename = 'screenshots/'+ proxy + '-2.png';

    await page.screenshot({path: filename});

    await browser.close();

    return Promise.all(promiseArray)
        .then(async (result) => {
            let cookies = await page.cookies();
            let cookieArray = [];

            cookies.forEach(function (item) {
                cookieArray.push(item.name + '='+item.value);
            });

            finalCookie = cookieArray.join(';');

            return finalCookie;
        });
};

我想确保我的 cookie 生成时页面已完全加载并且我得到正确的 cookie。

const timeout = millis => new Promise(resolve => setTimeout(resolve, millis));

标签: node.jspuppeteer

解决方案


你可以使用page.waitForNavigation()

// Navigate to desired page...

await page.waitForNavigation();

// Generate cookie...

推荐阅读