javascript - 在 Puppeteer 中访问 javascript 变量

标签 javascript node.js puppeteer

我正在尝试使用 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();
Console Output
flashVariableName 正在为页面上的 javascript 变量返回正确的名称,但我如何才能真正访问该变量?

最佳答案

你有两个问题。
这是第一个:

console.log(await page.evaluate( (flashVariableName) => flashVariableName ));
//                                ^^^^^^^^^^^^^^^^^
//                                |
//                                +--> this is undefined
如果您查看 Page#evaluate 的文档
enter image description here
你缺少的是 ...argspageFunction 提供参数的位.它应该是这样的:
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/

相关文章:

javascript - MongoDB 和 Node js 异步编程

node.js - 如何在特定目录中安装 npm 包

node.js - 注册时的 node-xmpp C2SServer 连接问题

jestjs - Puppeteer - checkbox.checked 未定义 - 为什么?

javascript - Puppeteer 无法获得完整的源代码

javascript - 通过悬停隐藏/取消隐藏 HTML 部分?

javascript - 单击返回到 Reactjs 中的先前状态或触发功能

javascript - Extjs 6 : What's the best practice to handle repeated configuration

javascript - 如果数组值已经存在,则删除 JavaScript

javascript - 如何自动化 ElectronJS 应用程序