【问题标题】:puppeteer page evaluate use require module in page evaluatepuppeteer 页面评估在页面评估中使用 require 模块
【发布时间】:2020-08-12 17:03:30
【问题描述】:

我不明白如何在 page.evaluate 中使用模块,我也在 SO 上找到了这篇文章:How to pass required module object to puppeteer page.evaluate SO

但我不明白如何使用它,我有过:

await page.addScriptTag({ path: './node_modules/fs.realpath/index.js'});

我明白了:

错误:评估失败:TypeError:fs.​​appendFileSync 不是函数

const fs = require('fs');

page.evaluate(()=>{
        let elements = document.querySelectorAll("a.myclass.vid");

        elements.forEach((element, index) => {
            fs.appendFileSync("textresult.txt", element.textContent+"\r\n");
        })

    });

感谢您的解释 :o)

【问题讨论】:

    标签: node.js module puppeteer require


    【解决方案1】:

    您传递给page.evaluate() 的那个匿名函数在puppeteer 正在运行的网页上下文中运行,所以它当然不知道fs 是什么。你需要从那个匿名函数返回一些东西,然后用它调用fs.appendFileSync:

    const texts = await page.evaluate(() => {
      return document.querySelectorAll('a.myclass.vid').map((el) => {
        return el.textContent + "\r\n"
      })
    })
    
    fs.appendFileSync('textresult.txt', texts)
    

    【讨论】:

    • 我也使用了你的想法,但是“map”返回:错误:评估失败:TypeErr 或:document.querySelectorAll(...).map 不是函数使用了这种语法,它可以工作:const TitresVideos = await page.evaluate(() => { let names = document.querySelectorAll( "a.myclass.video" ); let arr = Array.prototype.slice.call(names); let text_arr = []; for (let i = 0; i < arr.length; i += 1) { text_arr.push($vartraited+"\r\n"); } return text_arr; })
    • 嗨 @VeilleurTryToFix ,querySelectorAll 返回一个节点列表,而不是一个数组。为了使用像.map或.forEach这样的数组方法,我通常使用spread运算符如下:[...document.querySelectorAll( "a.myclass.video" )]你可以检查它here
    • 是的,抱歉,忘记了querySelectorAll 的返回类型,谢谢@charlyrl
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多