Puppeteer语言 - Page.evaluate using moment



我正在尝试使用"puppeteer": "^1.16.0","moment": "^2.24.0",。当运行page.evaluate()通过时刻将字符串转换为日期 obj 时,我得到:

错误:

评估失败:引用错误:未定义时刻

在下面找到我的最小示例:

const puppeteer = require("puppeteer-extra")
const moment = require('moment')
function shuffle(dataObjArr) {
    let res = dataObjArr.sort(() => Math.random() - 0.5);
    return res
}
let issuerUrls = JSON.parse('[{"id":62,"name":"Product 1","ecomUrl":"/product/252","createdAt":"2019-05-25T07:51:49.000Z","updatedAt":"2019-05-25T07:51:49.000Z"},  {"id":15,"name":"Product 2","ecomUrl":"/product/251","createdAt":"2019-05-25T07:51:49.000Z","updatedAt":"2019-05-25T07:51:49.000Z"}]')
let issuerUrlsShuffled = shuffle(issuerUrls)
let BASE_URL = "https://www.webscraper.io/test-sites/e-commerce/allinone"
// puppeteer usage as normal
puppeteer.launch({
    headless: false,
    args: ["--disable-notifications"]
}).then(async browser => {
    const page = await browser.newPage()
    await page.setViewport({
        width: 800,
        height: 600
    })
    for (let i = 0; i < issuerUrlsShuffled.length; i++) {
        try {
            let URL = BASE_URL + issuerUrlsShuffled[i].ecomUrl;
            await page.goto(URL)
            page.waitForNavigation({
                timeout: 60,
                waitUntil: 'domcontentloaded'
            });
            const data = await page.evaluate(() => {
                const priceData = []
                let date = "9/23/2016" // this is needed for testing purposes only!!!
                priceData.push({
                    price_date: moment(date, 'M/DD/YYYY').toDate()
                })
                return priceData
            }, moment)
            // show data
            console.log(JSON.stringify(data, null, 2))
            await page.waitFor(3000)
        } catch (error) {
            console.log(error)
        }
    }
    await browser.close()
})

如您所见,我尝试将moment实例传递给evaluate函数,但是仍然收到错误。

有什么建议我做错了什么吗?

感谢您的回复!

只能将

可序列化数据作为参数传递给page.evaluate函数。(有关详细信息,请参阅文档(。由于moment是一个函数,而函数不能序列化,因此您不能那么容易使用它。

要从 Node.js 环境向页面公开函数,可以使用page.exposeFunction 。引用文档:

该方法在页面的 window 对象上添加一个名为 name 的函数。调用时,该函数在 node 中执行puppeteerFunction.js并返回一个 Promise,该 Promise 解析为 puppeteerFunction 的返回值。

代码示例:

Node.js 环境中的以下代码设置了一个返回格式化日期的函数formatDate

await page.exposeFunction('formatDate', (date) =>
  moment(date, 'M/DD/YYYY').toDate()
);

请注意,您只需在页面上调用exposeFunction一次,因为它在导航中幸存下来。这意味着您可以将此代码置于循环之外。

那么你的木偶代码可以使用这样的函数:

const data = await page.evaluate(async () => {
  const priceData = []
  let date = "9/23/2016"
  priceData.push({
    price_date: await window.formatDate(date)
  })
  return priceData
})

最新更新