Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 记录来自Puppeter Node.js进程的客户端代码中的`console`调用_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript 记录来自Puppeter Node.js进程的客户端代码中的`console`调用

Javascript 记录来自Puppeter Node.js进程的客户端代码中的`console`调用,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,在下面的代码示例中,函数中作为参数传递给page.evaluate()的日志语句不会打印到节点控制台(终端)。但此函数外部的log语句(在末尾)正在按预期打印 另一位程序员建议,page.evaluate上下文可能是无头浏览器环境,而不是Node.js const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page =

在下面的代码示例中,函数中作为参数传递给
page.evaluate()
的日志语句不会打印到节点控制台(终端)。但此函数外部的log语句(在末尾)正在按预期打印

另一位程序员建议,
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语句使用节点环境作为其上下文,或者是启用浏览器头并从浏览器控制台读取语句的唯一选项

另一位程序员建议,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();
})();
对,这是Puppeter的关键之一,
evaluate
回调中的代码是在浏览器中计算的,而不是在节点进程中计算的(尽管使用Puppeter查看代码源一点也不明显)

您可以响应
页面
对象的属性,当在客户端代码中调用任何
控制台
方法(
日志
错误
等)时,会引发该属性。从该链接:

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

控制台
事件接收到一个,它告诉您它是什么类型的调用(
日志
错误
,等等),参数是什么(
args()
),等等。

需要记住一件事,因为参数需要通过HTTP从浏览器传输到节点,所以木偶程序需要序列化它们,上次我检查时,它无法序列化递归对象,例如
window
,因此最好在浏览器中有一个类似于
util.inspect
console.log
的自定义实现,它将所有参数字符串化,然后调用本机
console.log
@AlexeyLebedev-Ooh,有趣。感谢您对此进行标记。如果您对获取记录对象的JSON数据感兴趣,请参阅