web-dev-qa-db-fra.com

Collectez les éléments par nom de classe puis cliquez sur chacun d'eux - Marionnettiste

En utilisant Puppeteer, je souhaite obtenir tous les éléments d’une page avec un nom de classe particulier, puis les parcourir en boucle et cliquer sur chacun d’eux.

Avec jQuery, je peux y arriver avec

var elements = $("a.showGoals").toArray();

for (i = 0; i < elements.length; i++) {
  $(elements[i]).click();
}

Comment pourrais-je atteindre cet objectif avec Puppeteer?

Mettre à jour

J'ai essayé la réponse de Chridam ci-dessous, mais je ne pouvais pas me mettre au travail (bien que la réponse soit utile, donc merci, là-bas), j'ai donc essayé ce qui suit et cela fonctionne.

 await page.evaluate(() => {
   let elements = $('a.showGoals').toArray();
   for (i = 0; i < elements.length; i++) {
     $(elements[i]).click();
   }
});
3
Richlewis

Utilisezpage.evaluatepour exécuter JS:

const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    await page.evaluate(() => {
        let elements = document.getElementsByClassName('showGoals');
        for (let element of elements)
            element.click();
    });
    // browser.close();
});
5
chridam

Pour obtenir tous les éléments, vous devez utiliser page.$$ , qui est identique à [...document.querySelectorAll] (diffusé dans un tableau) à partir de l'API de navigateur requise. 

Ensuite, vous pouvez le parcourir (carte, pour, tout ce que vous voulez) et évaluer chaque lien:

const getThemAll = await page.$$('a.showGoals')
getThemAll.map(link => {
  await page.evaluate(() => link.click())
})

Puisque vous voulez aussi faire des actions avec ce que vous avez obtenu, je vous recommande d'utiliser page.$$eval qui fera la même chose que ci-dessus et d'exécuter ensuite une fonction d'évaluation avec chacun des éléments du tableau sur une ligne. Par exemple:

const clickThemAll = await page.$$eval('a.showGoals', links => link.map(link => link.click())

Pour mieux expliquer la ligne ci-dessus, $$eval renvoie un tableau de liens, puis exécute une fonction avec les liens en tant qu'argument, puis parcourt chaque lien via la méthode map.

Vérifiez la documentation officielle aussi, ils ont de bons exemples.

0
bsides