console.log在pupeteer评估函数中不起作用

时间:2017-10-29 15:47:35

标签: node.js puppeteer

考虑以下代码:

const puppeteer = require('puppeteer');

const run = async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.facebook.com/pg/fotosdacurva/photos/?tab=albums', { waitUntil: 'networkidle' });

    const data = await page.evaluate(() => {
        console.log("ola");

        const tds = Array.from(document.querySelectorAll('#content_container a'))
        return tds.map(td => td.textContent)
    });

    //console.log(data);
    await page.screenshot({ path: 'example.png' });

    await browser.close();
};

run();
console.logpage.evaluate()函数内的

<div style="text-align:center;background-color: #ffffff;display: inline-block;padding: 10px;-webkit-box-shadow: 3px 3px 3px #9E9E9E;-moz-box-shadow: 3px 3px 3px #9E9E9E;box-shadow: 3px 3px 3px #9E9E9E;"> <div style="display: inline-table;"> <img src="daenerys.png" style="display: block;margin: 0 auto;margin-bottom: 20px;width: 100%;"> <div class="cxl cgy" style="display: table-caption;width: 100%;caption-side: bottom;"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Quae necessitatibus architecto quis non error placeat illo enim illum quo corrupti molestias id sint recusandae animi obcaecati, laudantium nostrum fugit eaque. </div> </div> </div> 无效,我无法找出原因?我认为这可能与异步行为有关。该功能正在作为&#34;数据&#34;执行。正在设置变量。

谢谢。

3 个答案:

答案 0 :(得分:3)

如果你想收听浏览器的控制台,你可以简单地使用puppeteer的控制台事件。例如,请从docs

中查看此示例
page.on('console', msg => {
  for (let i = 0; i < msg.args.length; ++i)
    console.log(`${i}: ${msg.args[i]}`);
});

它会做的是,每次有控制台消息时,都会触发一个事件并且它将捕获该事件,并在nodeJS控制台上为您打印消息。

请记住,如果您打印dom元素或数组,原始浏览器控制台将正确打印它,但在nodeJS中,您可能会看到[object Object]或类似的文本。

答案 1 :(得分:1)

您可以在页面上侦听控制台事件,然后写入您自己的控制台:

const page = await browser.newPage();
page.on('console', console.log);

它与console.log()不完全相同,但它很有帮助。它会为您提供如下所示的输出:

ConsoleMessage {
  type: 'log',
  text: 'ola',
  args:
   [ JSHandle {
       _context: [Object],
       _client: [Object],
       _remoteObject: [Object],
       _disposed: false } ] }

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#event-console

答案 2 :(得分:0)

在 2021 年,您需要使用 async awaitJSHandle 对象获取参数。如果您生成 Promise.all(args) 并且下次尝试对 executionContextJSHandle 求值,它将显示 consoleMessage 的对象。

在这种情况下,请查看我的完整答案https://stackoverflow.com/a/66801550/9026103