在以下代码示例中,作为参数传递给 page.evaluate()
的函数内的日志语句不会打印到 Node 控制台(终端)。该函数外部(最后)的日志语句按预期打印。
另一位程序员建议,page.evaluate
上下文可能是 headless 浏览器环境,而不是 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 环境作为上下文,或者是我启用浏览器头并从浏览器控制台读取语句的唯一选择?
最佳答案
Another programmer suggested that maybe the page.evaluate context is the headless browser environment and not Node.js.
对,这是 Puppeteer 的关键之一,evaluate
回调中的代码是在浏览器中计算的,而不是在 Node 进程中(尽管从源代码来看这并不明显)使用 Puppeteer 编写代码)。
您可以回复console
event Page
对象的,当调用任何 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
等)、参数是什么(args()
),等等
关于javascript - 记录 Puppeteer Node.js 进程中客户端代码中进行的 `console` 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907677/