Estoy tratando de representar una página usando titiritero, extraer el nombre de una variable javascript dinámica en la página y devolver la variable como un objeto. Estoy usando titiritero y node.js para hacer esto.
Puedo obtener el nombre de la variable javascript que se genera en la página, pero cada vez que intento imprimirla en la consola, aparece un error " indefinido ". He pasado la mayor parte de la mañana tratando de resolver esto, pero estoy perplejo. Aquí está el código a continuación.
const puppeteer= require('puppeteer'); var url = 'https://www.website.com'; async function run () { try { const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox'] }); const page = await browser.newPage(); await page.goto(url); const flashVariableName = await page.evaluate( () => { var start = document.documentElement.innerHTML.indexOf('var flashvariable_') + 'var '.length; var tempDoc = document.documentElement.innerHTML.substr(start); var end = tempDoc.indexOf(' ='); return tempDoc.substr(0, end); }); console.log(await page.evaluate( (flashVariableName) => flashVariableName )); await browser.close(); } catch(e){ console.log("Error Occurred", e) } } run();
flashVariableName está devolviendo el nombre correcto para la variable javascript en la página, pero ¿cómo puedo obtener acceso a la variable?
Tienes dos problemas.
Este es el primero:
console.log(await page.evaluate( (flashVariableName) => flashVariableName )); // ^^^^^^^^^^^^^^^^^ // | // +--> this is undefinedSi observa la documentación de Page#evaluate
Lo que te falta es el bit ...args que proporciona parámetros a pageFunction . Debería haber sido esto en su lugar:
console.log(await page.evaluate( (flashVariableName) => flashVariableName, flashVariableName )); // ^^^^^^^^^^^^^^^^^ Pero eso no es suficiente porque flashVariableName es solo una cadena en este punto. Es el nombre de una variable pero no la variable en sí. Todavía necesita "evaluarlo":
console.log(await page.evaluate( (varName) => window[varName], flashVariableName )); Sin embargo, eso solo funciona si la variable que está tratando de leer está disponible en el alcance global (es decir window en su caso) Y se puede serializar (por ejemplo, si se refiere a una función o un elemento DOM que no será posible)
El valor de retorno del método page.evaluate() debe ser serializable. Otras formas devolverá indefinido. En este momento solo está devolviendo un String . Puede ver la definición aquí https://pptr.dev/#?product=Puppeteer&version=v5.5.0&show=api-pageevaluatepagefunction-args
let theVariableName = tempDoc.substr(0,end); return {theVariable: theVariableName} Después de esto, puede acceder a su variable en su variable flashVariableName .
He encontrado la mejor manera fácil. Vea el siguiente ejemplo
const flatFormData = await page.evaluate("__platform_data__"); console.log(flatFormData);