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?
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();
}
});
Utilisezpage.evaluate
pour 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();
});
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.