mi codigo es el siguiente
await page.waitForTimeout(1000); await page.waitForSelector( "#yDmH0d > c-wiz > div > div.WFnNle > c-wiz > div.OlSOob > c-wiz > div.ccvoYb.EjH7wc > div.AxqVh > div.OPPzxe > c-wiz.rm1UF.UnxENd.u3bW4e > span > span > div > textarea" ); let sourceString = "ni hao ma"; await page.type( "#yDmH0d > c-wiz > div > div.WFnNle > c-wiz > div.OlSOob > c-wiz > div.ccvoYb.EjH7wc > div.AxqVh > div.OPPzxe > c-wiz.rm1UF.UnxENd.u3bW4e > span > span > div > textarea", sourceString ); await page.waitForTimeout(5000); await page.waitForSelector( "#yDmH0d > c-wiz > div > div.WFnNle > c-wiz > div.OlSOob > c-wiz > div.ccvoYb.EjH7wc > div.AxqVh > div.OPPzxe > c-wiz.P6w8m > div.tm8pq" ); const [val1] = await page.$x( '//*[@id="yDmH0d"]/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[3]/c-wiz[2]/div[7]/div/div[1]/span[1]/span/span' ); const txtval1 = await val1.getProperty("textContent"); const rawtxtval1 = await txtval1.jsonValue(); console.log(rattxtval1);este código abre Google Translate, escribe algún texto, en este caso "ni hao ma" y devuelve la traducción del mismo. Todo esto funciona perfectamente, pero solo si hago clic en el primer cuadro yo mismo. Por alguna razón, no puedo hacer que ingrese el texto sin hacer clic en el cuadro. Intenté llamar a page.click() en el cuadro con la misma etiqueta, y dice que el nodo no existe como se muestra en el siguiente error
Error: No node found for selector: #yDmH0d > c-wiz > div > div.WFnNle > c-wiz > div.OlSOob > c-wiz > div.ccvoYb.EjH7wc > div.AxqVh > div.OPPzxe > c-wiz.rm1UF.UnxENd.u3bW4e > span > span > div > textareasin embargo, cuando hago clic en él mismo mientras se ejecuta el programa, luego escribe en el cuadro perfectamente (usando exactamente la misma etiqueta para encontrar en qué cuadro escribir) y recupera el texto en el otro cuadro también.
¿Estoy usando la función incorrecta o me estoy perdiendo por completo un paso de lo que está pasando?
Cualquier ayuda muy apreciada.
Este enfoque parece demasiado complicado. En primer lugar, por lo general se deben evitar los selectores hiperespecíficos generados por el navegador. Es demasiado fácil para JS deslizar un nuevo elemento en la cadena inesperadamente o cambiar una sola clase o identificación y todo se desmorona.
En segundo lugar, waitForTimeout es casi siempre un enfoque deficiente, como advierte el archivo Léame de Puppeteer. Apéguese a una estrategia basada en eventos usando waitForSelector y waitForFunction tanto como sea posible para evitar condiciones de carrera y secuencias de comandos lentas.
const puppeteer = require("puppeteer"); // ^13.5.1 let browser; (async () => { browser = await puppeteer.launch({headless: true}); const [page] = await browser.pages(); await page.goto("https://translate.google.com"); await page.type(".er8xn", "ni hao ma"); await page.waitForSelector(".Q4iAWc"); const phrases = await page.$$eval(".Q4iAWc", els => els.map(e => e.textContent)); console.log(phrases.join(" ")); // => How are you })() .catch(err => console.error(err)) .finally(() => browser?.close()) ;Esto se puede optimizar aún más navegando directamente a https://translate.google.com/?sl=auto&tl=en&text=ni%20hao%20ma&op=translate para evitar seleccionar y manipular el área de texto por completo. La navegación directa es más rápida y robusta, ya que no necesita conectarse a ninguna clase o ID de DOM. Solo tenga cuidado de codificar su cadena de consulta correctamente.