木偶。 Page.evluate()未运行或未获得结果

时间:2019-01-26 16:43:06

标签: node.js puppeteer

我正在尝试运行一个非常简单的Pupeteer示例。但是在page.evalute()方法中什么也没有发生,没有错误,没有结果。我在做什么错了?

const puppeteer = require("puppeteer");
    module.exports = class zrGrabber {
        async startGrabbing() {
            try {
                const browser = await puppeteer.launch();
                const page = await browser.newPage();
                await page.goto('https://www.zr.ru/news/avtomobili/');
                await page.evaluate(() => {
                    const links = document.querySelectorAll(`div.head > h2 > a`)
                    console.log(links)
                });
                browser.close();
            } catch (err) {
                console.log(err)
            }
        }
    }

这就是它在Node上的运行方式:

const http = require('http');
const port = 3000;
const cron = require('node-cron');
const zrGrabber = require('./grabbers/zr.grabber');

const requestHandler = (request, response) => {
    response.end('Hello Node.js Server!')
}
const server = http.createServer(requestHandler)
server.listen(port, (err) => {
    cron.schedule('* * * * *', async () => {
        const zr = new zrGrabber();
        await zr.startGrabbing();
    });
    if (err) {
        return console.log('something bad happened', err)
    }
    console.log(`server is listening on ${port}`)
})

1 个答案:

答案 0 :(得分:0)

console.log(links)在页面上下文中执行,因此links在浏览器控制台中输出(如果在可见模式下启动Chrome并在关闭浏览器之前打开DevTools,则可以看到它)。如果需要在Node.js流程控制台中输出此值,则需要返回可序列化的值,获取它并在Node.js上下文中对其进行管理:

                const links = await page.evaluate(() => {
                    const links = document.querySelectorAll(`div.head > h2 > a`);
                    return [...links].map(link => link.href);
                });
                console.log(links);
                browser.close();