En el siguiente sitio, después de ingresar una frase de búsqueda como "bebé" (¡pruébalo!), la llamada Titiritero page.mouse.down() no tiene el mismo efecto que hacer clic y mantener presionado el mouse físico: https:// www.dextools.io/app/bsc
Después de ingresar una frase de búsqueda, aparece un menú de selección desplegable falso, que en realidad es una UL , y estoy tratando de hacer clic en el primer resultado de búsqueda. Así que uso un código como este
await page.mouse.move(200, 350); // let's assume this is inside the element I want await page.mouse.down(); await new Promise((resolve) => setTimeout(resolve, 2000)); // wait 2 secs await page.mouse.up();El efecto esperado de este código es que, durante los 2 segundos que Titiritero "mantiene" presionado el botón del mouse, el menú desplegable falso permanece visible, y cuando Titiritero "suelta" el botón del mouse, el sitio redirige al resultado de la búsqueda del artículo. seleccionado.
Esto es exactamente lo que sucede cuando uso el mouse físico .
Sin embargo, lo que sucede con Puppeteer es que el menú desplegable simplemente desaparece, como si hubiera presionado la tecla Escape , y el page.mouse.up() más tarde ya no tiene ningún efecto.
Soy consciente de que PPT tiene algunas peculiaridades con respecto al mouse, el teclado, mantener y soltar botones y teclas modificadoras, especialmente cuando se hace todo lo anterior a la vez. Por ejemplo, arrastrar y soltar no funciona como se esperaba, pero ninguna de las soluciones propuestas aquí me funciona: https://github.com/puppeteer/puppeteer/issues/1265
En lugar de dos operaciones separadas con el mouse hacia abajo y hacia arriba, puede intentar esto de acuerdo con los documentos del titiritero :
// selector would uniquely identify the button on your page that you would like to click selector = '#dropdown-btn' await page.click(selector, {delay: 2000})Una vez que tenga el elemento de la lista en el que desea hacer clic, debe buscar la primera etiqueta <a> dentro de este elemento y usar la referencia que hace en este <a> para realizar un clic.
De la documentación del titiritero dice que si hay una navegación que debe usar:
const [response] = await Promise.all([ page.waitForNavigation(waitOptions), page.click(selector, clickOptions), ]); donde selector será una referencia a la etiqueta <a> mencionada.
No puedo reproducir el problema con este script de prueba. Se hace clic en el enlace con la siguiente navegación:
import puppeteer from 'puppeteer'; const browser = await puppeteer.launch({ headless: false, defaultViewport: null }); try { const [page] = await browser.pages(); await page.goto('https://www.dextools.io/app/bsc', { timeout: 0 }); const input = await page.waitForSelector('.input-container input'); await input.type('baby'); const link = await page.waitForSelector('.suggestions-container.is-visible a:not(.text-sponsor)'); await link.click(); } catch (err) { console.error(err); }