为什么在page.evaluate
,page.$
,page.$$
,page.$eval
,page.$$eval
的console.log上看不到我的消息
而且无法访问变量吗?
let variable = 0;
const divColors = await page.evaluate(() => {
const divs = Array.from(document.querySelectorAll('.map-filters div'));
let text = divs.map((element, index) => {
console.log(element.textContent)
variable =1;
return element.style.color;
})
return text;
})
在此示例中,为什么我不能做variable=1
和console.log(element.textContent)
?
答案 0 :(得分:1)
您在console.log
内使用page.evaluate
,因此它将其输出记录到Chromium浏览器而不是节点输出。要在节点控制台中查看来自浏览器的控制台消息,需要在创建page
对象之后并且在脚本中使用console.log
之前订阅它们:
const page = await browser.newPage();
page.on('console', consoleObj => console.log(consoleObj.text()));
page.evaluate(...);
对于variable
变量,实际上在脚本中有两个。
第一个存在于node.js上下文中:
let variable = 0;
另一个-在网页上下文中:
page.evaluate( () => {
variable = 1;
})
它们是完全不同的。将page.evaluate
视为进入另一个世界的门户:存在的对象仅在puppeteer
正在驱动的Web浏览器中打开的页面上的javascript运行时中存在。 node
有自己的运行时以及自己的对象集。
您可以将数据从page.evaluate
传递到node
:
let variable = 420;
page.evaluate(variable => {
// it is now passed here from outside
console.log(variable)
}, variable);