当我通常调用一个函数时,它是工作的,但是当我在page.evaluate()
中调用它时,没有定义函数。下面是一个演示:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
page.on('console', msg => console.log(msg.text())) // so console.log() works in page.evaluate()
const test = () => console.log('works')
await test() // it runs
await page.evaluate(() => test()) // ReferenceError: test is not defined
})()
发布于 2022-09-14 01:31:31
Puppeteer生成的页面上下文(在其虚拟浏览器中)与编写实现代码的Node上下文不同。当page.evaluate
被传递给一个函数时,该函数被序列化,然后传递给浏览器,然后反序列化和计算(在不同的上下文中)。在这里,页面上下文无法访问test
,因为该变量仅在节点中定义,而不是在页面上定义。
但是,如果需要,可以通过在页面上下文中定义函数来将函数放入页面中。
await page.evaluate(() => {
window.test = () => console.log('works');
});
await page.evaluate(() => test())
或
await page.evaluate(() => {
const test = () => console.log('works');
test();
});
https://stackoverflow.com/questions/73710551
复制相似问题