Estoy tratando de aprender JavaScript y tratando de seleccionar el menú desplegable Ordenar y hacer clic en uno de sus cuatro elementos en este sitio web: https://www.centris.ca/en/properties~for-sale?view=Thumbnail
Pero sigo no node found for selector .
Este es mi código:
const puppeteer = require('puppeteer') function run () { return new Promise(async (resolve, reject) => { try { const browser = await puppeteer.launch({headless: false}) const page = await browser.newPage() await page.goto("https://www.centris.ca/") await page.$eval('i.far.fa-search', el => el.click()) await page.select("select#selectSortById", "3") //browser.close() return resolve(page) } catch (e) { return reject(e) } }) } run().then(console.log).catch(console.error)El código que está utilizando es para manipular elementos HTML <select> y <option> . Pero la estructura que está viendo son solo algunos <a> s en un <div> que tienen estilo y tienen JS que los hace comportarse como un menú desplegable, pero en realidad no son menús desplegables en lo que respecta a Titiritero, probablemente explicando por qué tu código no funciona.
Simplemente seleccionaría el <a> (actuando como una "opción") que desea, luego haría clic en él ( usando el click nativo para evitar la rareza de la visibilidad ). waitForFunction una función de espera para detectar cuándo se aplicó realmente el filtro, pero es posible que eso no sea lo que quieras hacer a continuación. Aun así, ayuda a verificar que esto funcione antes de descargar la captura de pantalla.
También configuré un agente de usuario para que funcione el modo sin cabeza, si lo desea.
const puppeteer = require("puppeteer"); // ^13.0.1 let browser; (async () => { browser = await puppeteer.launch({headless: true}); const [page] = await browser.pages(); await page.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"); await page.goto("https://www.centris.ca/en/properties~for-sale"); const recent = await page.waitForSelector('#selectSortById [data-option-value="3"]'); await recent.evaluate(el => el.click()); // assume the whole first page are new listings and assume a few classes exist await page.waitForFunction(` document.querySelectorAll(".banner.new-property").length === document.querySelectorAll(".property-thumbnail-item").length `); await page.screenshot({path: "result.png"}); })() .catch(err => console.error(err)) .finally(() => browser?.close()) ;No está relacionado con la tarea de raspado, pero vale la pena echarle un vistazo para mejorar su código JS: ¿Qué es el antipatrón de construcción de promesa explícita y cómo lo evito?