And*_*kov 1 javascript node.js jestjs puppeteer
为什么我无法看到的console.log在我的消息page.evaluate,page.$,page.$$,page.$eval,page.$$eval
并不能以访问变量的是?
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;
})
Run Code Online (Sandbox Code Playgroud)
为什么我不能做variable=1,console.log(element.textContent)在这个例子中?
您使用的是console.loginside page.evaluate,因此它将其输出记录到 Chromium 浏览器而不是节点输出。要在节点的控制台中查看来自浏览器的控制台消息,需要在page创建对象之后和在console.log脚本中使用之前订阅它们:
const page = await browser.newPage();
page.on('console', consoleObj => console.log(consoleObj.text()));
page.evaluate(...);
Run Code Online (Sandbox Code Playgroud)
至于variable变量,实际上你的脚本中有两个变量。
第一个存在于 node.js 上下文中:
let variable = 0;
Run Code Online (Sandbox Code Playgroud)
另一个 - 在网页上下文中:
page.evaluate( () => {
variable = 1;
})
Run Code Online (Sandbox Code Playgroud)
他们是完全不同的。将其page.evaluate视为进入另一个世界的门户:存在于那里的对象仅存在于puppeteer正在驱动的 Web 浏览器中打开的页面上的 javascript 运行时内部。node有自己的运行时和自己的一组对象。
您可以将数据传入page.evaluatefrom node:
let variable = 420;
page.evaluate(variable => {
// it is now passed here from outside
console.log(variable)
}, variable);
Run Code Online (Sandbox Code Playgroud)