node.js - 节点 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));
解决方案
你可以使用page.waitForNavigation()
:
// Navigate to desired page...
await page.waitForNavigation();
// Generate cookie...
推荐阅读
- rdf - 使用属性来描述类
- cypher - libcypher-parser 是否支持 REGEX 运算符?
- .htaccess - 如何将文件夹及其子文件夹重定向到子域
- auth0 - Auth0 允许在 Azure 中托管的应用的 Web 源
- c++ - 为什么当您发送指向指针的指针时遍历会永久更改链接列表但仅指针不会
- c++ - 如何在 if-constexpr 中使用概念?
- c# - 如何使用正则表达式组查找嵌套评论
- c# - 生成接受任何实体的动态查询
- javascript - Ionic Error Object(...) 不是 NativePageTransitions.fade 中的函数
- html - 在 flexed div 的中间垂直对齐内容