Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

365
Visualizações
no se puede obtener ElementHandle al filtrar elementos de titiritero

Estoy tratando de usar Puppeteer para extraer datos de https://pagespeed.web.dev . Necesito poder tomar capturas de pantalla de los resultados y, aunque sería mucho más simple usar la propia API de Google para obtener los datos sin procesar. no puedo hacer una captura de pantalla de los resultados reales de esa manera. El desafío al que me enfrento es filtrar los elementos DOM y al mismo tiempo conservar la naturaleza ElementHandle de los objetos. Por ejemplo, obtener los botones "Esta URL" / "Origen":

En una consola JS normal, ejecutaría esto:

 [...document.querySelectorAll('button')].filter(b => b.innerText === 'This URL')

Esto me daría una matriz de elementos DOM en los que luego podría ejecutar click() o lo que sea.

He intentado varias formas de hacer que Puppeteer me proporcione un objeto ElementHandle utilizable y todos han devuelto una matriz de objetos, siendo el único miembro de ese objeto un objeto __incrementalDOMData :

 const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto(`https://pagespeed.web.dev/report?url=${url}`) await page.waitForSelector(homepageWaitSelector, { visible: true }) // here's where the fun starts const buttons = await page.$$eval('button', buttons => buttons.filter(button => button.innerText === 'This URL')) const buttons = await page.$$eval('button', buttons => buttons.map(b => b.innerText).filter(t => t === 'This URL')) // This one seems to run because the list of elements returned has the right length, but I can never get a breakpoint to catch inside the `evaluate` method, nor does a `console.log` statement actually print. const buttons = await page.evaluate(() => { const b = [...document.querySelectorAll('button')].filter(b => b.innerText === 'This URL') return b })

Todos esos métodos terminan devolviendo algo como esto:

 [{ __incrementalDOMData: { j: ['class', 'the-classes-used'], key: 'a key', v: true }]

Debido a que hay tantos botones, y debido a que los nombres de las clases son todos aleatorios y reutilizados, no puedo solo apuntar a los que quiero (quiero decir, supongo que podría construir un selector súper preciso), filtrarlos y luego regresar no solo los datos filtrados sino los elementos reales en sí mismos. ¿Es posible lo que pido?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Gracias al comentario anterior de ggorlen, simplifiqué mi enfoque y conseguí que algo funcionara sin un selector o una lógica demasiado complejos:

 const buttonContainer = await page.$('div.R3HzDf.ucyZQe') const thisUrlButton = await buttonContainer.$(':first-child') await thisUrlButton.evaluate(b => b.click()) await page.screenshot({ path: 'homepage.png' }) const originButton = await buttonContainer.$(':last-child') await originButton.evaluate(b => b.click()) await page.screenshot({ path: 'origin.png' })
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda