在以下代码示例中,未将作为参数传递给page.evaluate()
的函数内部的log语句打印到Node控制台(终端)上。不过,此功能之外的日志语句(最后)正在按预期方式打印。
另一位程序员建议page.evaluate
上下文是无头浏览器环境,而不是Node.js。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setExtraHTTPHeaders({Referer: 'https://sparktoro.com/'});
await page.goto('https://sparktoro.com/trending');
await page.waitForSelector('div.title > a');
const stories = await page.evaluate(() => {
const selection = document.querySelectorAll('div.title > a');
console.log('selection', selection);
const links_array = Array.from(selection);
console.log('links_array', links_array);
const hrefs = links_array.map(anchor => anchor.href)
console.log('hrefs', hrefs);
return hrefs
});
console.log(stories);
await browser.close();
})();
是否有任何方法可以强制所有console.log语句使用Node环境作为其上下文,还是我唯一的启用浏览器头并从浏览器控制台读取语句的选项?
答案 0 :(得分:3)
另一位程序员建议page.evaluate上下文是无头浏览器环境,而不是Node.js。
对,这是Puppeteer的关键之一,evaluate
回调中的代码是在浏览器中评估的,而不是在Node进程中评估的(尽管使用Puppeteer查看代码源一点也不明显) )。
您可以响应Page
对象的console
event,当使用任何console
方法(log
,error
等)时会引发该对象。在客户端代码中调用。通过该链接:
page.on('console', msg => {
for (let i = 0; i < msg.args().length; ++i)
console.log(`${i}: ${msg.args()[i]}`);
});
console
事件收到一个ConsoleMessage
object,它告诉您调用的类型(log
,error
等),参数是什么({ {1}})等。