Estoy tratando de obtener todos los elementos de los botones de una página web usando el código:
const test = await page.evaluate(() => { return document.querySelectorAll("button") }) console.log(test)Cuando registro la variable de prueba, arroja 'indefinido', mientras que cuando ejecuto el siguiente código en la consola de Chrome:
document.querySelectorAll("button")Produce la cantidad correcta de elementos.
Debe hacer todo lo que funcione con HTMLElements en el contexto del sitio web (por lo tanto, desde dentro de la devolución de llamada de evaluate ).
Al final de la evaluate , deja el contexto del sitio, está muy limitado a lo que puede devolver de la evaluate .
Los datos que devuelve de la evaluate deben ser serializables , los elementos DOM no son serializables de manera significativa.
Por lo tanto, solo puede devolver algo que se pueda serializar utilizando JSON.stringify .
Mi objetivo final es verificar todos los botones hasta que encuentre un botón con cierto texto interno y luego haga clic en él.
Entonces probablemente no quiera usar la evaluate , consulte los elementos desde fuera del contexto de los sitios usando $ o $$
let buttons = await page.$$("button") Para obtener el texto de ElementHandler , puede usar:
const text = await page.evaluate(element => element.textContent, buttons[0]);o
const text = await (await buttons[0].getProperty('textContent')).jsonValue(); Un click se puede realizar con:
await buttons[0].click()Los valores devueltos por la evaluación deben ser serializables por JSON ya que el titiritero está devolviendo llamadas a la API de Chrome, intente esto:
const test = await page.evaluate() => { let elements = Array.from(document.querySelectorAll("button")); let buttons = elements.map(element => { return element }) return buttons; }