¿Cómo puedo pasar una variable a una función de evaluación?
Estoy intentando pasar una variable a una page.evaluate()
función en Puppeteer , pero cuando uso el siguiente ejemplo muy simplificado, la variable evalVar
no está definida.
No puedo encontrar ningún ejemplo sobre el que basarme, así que necesito ayuda para pasar esa variable a la page.evaluate()
función para poder usarla internamente.
const puppeteer = require('puppeteer');
(async() => {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
const evalVar = 'WHUT??';
try {
await page.goto('https://www.google.com.au');
await page.waitForSelector('#fbar');
const links = await page.evaluate((evalVar) => {
console.log('evalVar:', evalVar); // appears undefined
const urls = [];
hrefs = document.querySelectorAll('#fbar #fsl a');
hrefs.forEach(function(el) {
urls.push(el.href);
});
return urls;
})
console.log('links:', links);
} catch (err) {
console.log('ERR:', err.message);
} finally {
// browser.close();
}
})();
Aceptado
Tienes que pasar la variable como argumento de pageFunction
esta manera:
const links = await page.evaluate((evalVar) => {
console.log(evalVar); // 2. should be defined now
...
}, evalVar); // 1. pass variable as an argument
Puede pasar múltiples variables pasando más argumentos a page.evaluate()
:
await page.evaluate((a, b c) => { console.log(a, b, c) }, a, b, c)
Los argumentos deben ser serializables como JSON o JSHandle
como objetos en el navegador: https://pptr.dev/#?show=api-pageevaluatepagefunction-args
Te animo a que sigas con este estilo, porque es más conveniente y legible .
let name = 'jack';
let age = 33;
let location = 'Berlin/Germany';
await page.evaluate(({name, age, location}) => {
console.log(name);
console.log(age);
console.log(location);
},{name, age, location});