Javascript 木偶演员-Page.使用力矩进行评估

Javascript 木偶演员-Page.使用力矩进行评估,javascript,momentjs,puppeteer,Javascript,Momentjs,Puppeteer,我正在尝试使用“木偶演员”:“^1.16.0”和“瞬间”:“^2.24.0”。运行page.evaluate()时,通过获取以下信息将字符串转换为日期对象: 错误:评估失败:引用错误:未定义时刻 下面是我的最小示例: const puppeteer = require("puppeteer-extra") const moment = require('moment') function shuffle(dataObjArr) { let res = dataObjArr.sort((

我正在尝试使用
“木偶演员”:“^1.16.0”
“瞬间”:“^2.24.0”
。运行
page.evaluate()
时,通过获取以下信息将字符串转换为日期对象:

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

下面是我的最小示例:

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()
})
const puppeter=require(“木偶演员额外”)
常数力矩=要求(‘力矩’)
函数shuffle(dataObjArr){
让res=dataObjArr.sort(()=>Math.random()-0.5);
返回res
}
让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”})
让IssuerUrlShuffled=shuffle(issuerUrls)
让BASE_URL=”https://www.webscraper.io/test-sites/e-commerce/allinone"
//木偶演员的正常使用
木偶演员({
无头:错,
args:[“--禁用通知”]
})。然后(异步浏览器=>{
const page=wait browser.newPage()
等待page.setViewport({
宽度:800,
身高:600
})
for(设i=0;i{
const priceData=[]
let date=“9/23/2016”//这仅用于测试目的!!!
价格数据推送({
价格/日期:时间(日期,'M/DD/YYYY')。toDate()
})
返回价格数据
},瞬间)
//显示数据
log(JSON.stringify(数据,null,2))
等待页面。等待(3000)
}捕获(错误){
console.log(错误)
}
}
等待浏览器关闭()
})
如您所见,我试图将
时刻
实例传递给
求值
函数,但仍然得到错误

有什么建议我做错了什么


谢谢你的回复

只能将可序列化数据传递到
页面。请将
函数作为参数进行求值。(有关更多信息,请参阅)。由于
moment
是一个函数,并且函数不能序列化,所以您不能那么容易地使用它

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

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

代码示例:

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

wait page.exposeFunction('formatDate',(date)=>
时刻(日期“M/DD/YYYY”)。toDate()
);
请注意,您只需在页面上调用一次
exposeFunction
,因为它在导航过程中仍然有效。这意味着您可以将此代码置于循环之外

然后你的木偶师代码可以使用如下功能:

const data=wait page.evaluate(异步()=>{
const priceData=[]
出租日期=“9/23/2016”
价格数据推送({
价格日期:等待窗口。格式日期(日期)
})
返回价格数据
})

@Vaviloff谢谢你的提示。:)
等待
丢失。。。我自己刚试过,现在可以用了。谢谢代码。但是,当脚本结束时,我收到以下错误:
错误:无法添加名为formatDate的页面绑定:窗口['formatDate']已存在有什么建议吗?@Anna.Klee我想你把函数放在循环中了?您应该只将函数绑定到页面一次,而不是在每次页面导航之后。因此,你可以把它放在循环之外,错误就应该消失了。:D很高兴看到托马斯和瓦维洛夫以及大家互相帮助。我认为我们应该在答案上注意,暴露函数应该在任何循环或导航之前添加,因为“通过page.exposeFunction安装的函数在导航中幸存。”@Md.AbuTaher木偶演员stackoverflow团队走到一起:D在答案中添加了提示。