当前位置: 首页 > 知识库问答 >
问题:

在Chrome+Puppeeter的evaluate()上下文中有没有添加脚本添加新函数的方法?

袁单鹗
2023-03-14

例如,包含一个具有帮助函数x的文件来调用Xpath函数:x('//a/@href')

共有1个答案

林鹏鹍
2023-03-14

您可以在单独的页中注册helper函数。evaluate()函数。page.exposeFunction()看起来很诱人,但它不能访问浏览器上下文(您需要document对象)。

下面是一个使用$x()注册帮助器函数的示例:

const puppeteer = require('puppeteer');

const helperFunctions = () => {
    window.$x = xPath => document
        .evaluate(
            xPath,
            document,
            null,
            XPathResult.FIRST_ORDERED_NODE_TYPE,
            null
        )
        .singleNodeValue;
};

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org', { waitUntil: 'networkidle2' });

    await page.evaluate(helperFunctions);

    const text = await page.evaluate(() => {
        // $x() is now available
        const featureArticle = $x('//*[@id="mp-tfa"]');

        return featureArticle.textContent;
    });
    console.log(text);
    await browser.close();
})();

(编辑-从文件中添加帮助程序

window.$x = xPath => document
    .evaluate(
        xPath,
        document,
        null,
        XPathResult.FIRST_ORDERED_NODE_TYPE,
        null
    )
    .singleNodeValue;
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org', { waitUntil: 'networkidle2' });

    await page.addScriptTag({ path: './helperFunctions.js' });

    const text = await page.evaluate(() => {
        // $x() is now available
        const featureArticle = $x('//*[@id="mp-tfa"]');

        return featureArticle.textContent;
    });
    console.log(text);
    await browser.close();
})();
 类似资料:
  • 问题内容: 如果不输入URL,我想让Tomcat自动在我的应用程序上下文中添加一个斜杠。 当我使用Jetty进行测试时,它会自动在应用程序的上下文中添加斜杠,但是Tomcat不会这样做。 我不确定一旦部署将命名上下文,因为我会将WAR交给其他人,因此HTML中的任何资源引用都是相对的。有什么方法可以让Tomcat自动添加重定向尾号到相同的上下文? 当前在Spring 3中使用Tomcat 7。 问

  • 到目前为止我们只使用了C++内置的函数,然而也可以添加新函数。实际上我们已经见过一个函数定义了:main。main这个函数名很特殊,因为它表示程序开始执行的地方,但main函数的语法形式和其它函数定义一样: void 函数名(参数列表) { 语句 } 你可以为自己的函数任意定义名称,但不能命名为main或者其它C++关键字。参数列表指定了使用(或称为调用)新函数所需要提供的信息(如果有的话)

  • 使用PHP-PDO和SQLite,我可以编写一个PDO调用来检查表中是否存在某一行(通过检查主键),如果不存在,则编写另一个PDO调用来创建该行。但我觉得应该可以在一个命令中实现……类似于“如果不存在,则创建表”。是否有类似“不存在时插入行”的内容?

  • 我试图根据元素的id从超文本标记语言文件中读取文本,并将其显示在JTextPane中。但是,当我读取文本并显示它时,它不会进入新行。以下是正在读取的超文本语言标记的示例: 我从HTML页面读取的方法是: 我用来更新JTextPane中文本的方法是: 用户应该在文本框中输入命令,然后单击提交按钮,并根据输入的命令获取反馈。问题是,输入的每个命令都出现在同一行,而不是新行。 如果appendText为

  • 当我添加测试JsonObject列表时,只有最后一个JsonObject被添加到JsonArray。我不明白为什么,因为我遵循oracle的留档。https://docs.oracle.com/javaee/7/api/javax/json/JsonArray.html 名为TestRun的类中的方法 Main(注意:我使用faker生成随机信息)

  • [![我想点击Male,它反映在文本区域的Gender旁边:Male] 例如,我得到了这个脚本,我想要一个选项,当我点击按钮Male,它显示在gender旁边:在里面,如果我点击Male,它就会显示在Male旁边,就像这个Male,faleme? 文本框的图像: