我正在尝试使用 puppeteer 呈现页面,提取页面上动态 javascript 变量的名称,并将变量作为对象返回。我正在使用 puppeteer 和 node.js 来执行此操作。
我能够获取页面上正在生成的 javascript 变量的名称,但每当我尝试将其打印到控制台时,我都会收到“ undefined ”错误。我花了早上的大部分时间试图弄清楚这一点,但我很难过。这是下面的代码。
const puppeteer= require('puppeteer');
var url = 'https://www.website.com';
async function run () {
try {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox']
});
const page = await browser.newPage();
await page.goto(url);
const flashVariableName = await page.evaluate( () => {
var start = document.documentElement.innerHTML.indexOf('var flashvariable_') + 'var '.length;
var tempDoc = document.documentElement.innerHTML.substr(start);
var end = tempDoc.indexOf(' =');
return tempDoc.substr(0, end);
});
console.log(await page.evaluate( (flashVariableName) => flashVariableName ));
await browser.close();
} catch(e){
console.log("Error Occurred", e)
}
}
run();
flashVariableName 正在为页面上的 javascript 变量返回正确的名称,但我如何才能真正访问该变量?
最佳答案
你有两个问题。
这是第一个:
console.log(await page.evaluate( (flashVariableName) => flashVariableName ));
// ^^^^^^^^^^^^^^^^^
// |
// +--> this is undefined
如果您查看 Page#evaluate 的文档你缺少的是
...args
为 pageFunction
提供参数的位.它应该是这样的:console.log(await page.evaluate( (flashVariableName) => flashVariableName, flashVariableName ));
// ^^^^^^^^^^^^^^^^^
但这还不够,因为 flashVariableName
此时只是一个字符串。它是变量的名称,而不是变量本身。您仍然需要“评估”它:console.log(await page.evaluate( (varName) => window[varName], flashVariableName ));
但是,仅当您尝试读取的变量在全局范围内可用时才有效(即 window
在您的情况下)和 它可以被序列化(例如,如果它引用了一个不可能的函数或 DOM 元素)
关于javascript - 在 Puppeteer 中访问 javascript 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65741375/