2017-09-07 2 views
13

J'essaie de passer une variable dans une fonction page.evaluate() dans Puppeteer, mais lorsque j'utilise l'exemple très simplifié suivant, la variable evalVar est indéfinie.Puppeteer: pass variable dans .evaluate()

Je suis nouveau sur Puppeteer et ne trouve aucun exemple sur lequel construire, donc j'ai besoin d'aide pour passer cette variable dans la fonction page.evaluate() afin que je puisse l'utiliser à l'intérieur.

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(); 

    } 

})(); 

Répondre

22

Vous devez passer la variable comme un argument à la pageFunction comme ceci:

const links = await page.evaluate((evalVar) => { 

    console.log(evalVar); // should be defined now 
    … 

}, evalVar); 

Les arguments peuvent également être sérialisés: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args.

+0

Merci, c'est fait :) Beaucoup apprécié! –

+0

Bonjour, comment passeriez-vous plusieurs variables? – chitzui

+1

Aussi, je ne suis pas vraiment capable de passer une fonction: var myFunction = function() {console.log ("hello")}; en attente de page.evaluate (func => func(), myFunction); me donne: 'L'évaluation a échoué: TypeError: func n'est pas une fonction' .. Pourquoi? – chitzui

2

Je vous encourage à coller sur ce style, car il est plus pratique et lisible.

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});