Latenode

Automatisation de navigateur avec Puppeteer et JavaScript : mise en œuvre pratique dans Node.js

Découvrez comment automatiser des tâches de navigateur avec Puppeteer dans Node.js, du scraping web à l’automatisation de formulaires, grâce à des exemples pratiques et des bonnes pratiques.

11 min de lecture
Interface de navigateur automatisée avec Puppeteer et scripts JavaScript

Puppeteer est une bibliothèque Node.js qui automatise les tâches de navigateur telles que le scraping web, les tests d’interface utilisateur et les workflows répétitifs. Il fonctionne à la fois en mode headless (sans interface) et en mode navigateur complet, et communique avec les navigateurs via le DevTools Protocol. Voici pourquoi il constitue un excellent choix pour les développeurs :

  • Gestion du contenu dynamique : idéale pour les applications web modernes et le contournement des systèmes de détection.
  • Cas d’usage courants : scraping web, génération de PDF, capture de captures d’écran et automatisation de formulaires.
  • Installation simple : installez Puppeteer avec npm install puppeteer, qui inclut une version compatible de Chrome.

Exemple rapide :

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();
}

runAutomation();

Pourquoi il se démarque :

  • Modes : headless (tâches CI/CD) ou interface complète (débogage).
  • Interactions avec les pages : automatisez les clics, la saisie et la navigation à l’aide de sélecteurs CSS.
  • Conseils de performance : désactivez les images, utilisez le mode furtif et gérez efficacement les opérations asynchrones.

Des débutants aux utilisateurs avancés, Puppeteer simplifie l’automatisation de navigateur et en fait un outil incontournable pour les développeurs Node.js.

Tests et automatisation web modernes avec Puppeteer (Google ...

Installation et configuration initiales

Suivez ces étapes pour configurer Puppeteer dans Node.js et préparer votre environnement pour l’automatisation.

Configuration de l’environnement Node.js

Pour commencer, vous aurez besoin de trois composants principaux :

ComposantObjectifCommande de vérification
Node.jsEnvironnement d’exécutionnode --version
npmGestionnaire de paquetsnpm --version
Google ChromeMoteur de navigateurVérifier l’installation

Comme npm est inclus avec Node.js, l’installation de Node.js vous fournit les deux outils. Téléchargez la dernière version Long Term Support (LTS) depuis le site officiel de Node.js pour une meilleure stabilité et compatibilité [2].

Configuration d’un projet avec Puppeteer

Voici comment créer un nouveau projet Puppeteer :

  • Étape 1 : exécutez mkdir puppeteer-project pour créer un dossier de projet.
  • Étape 2 : accédez au dossier et initialisez-le avec cd puppeteer-project && npm init -y.
  • Étape 3 : installez Puppeteer avec npm install puppeteer.

Lorsque vous installez Puppeteer, celui-ci télécharge automatiquement une version de Chrome for Testing compatible avec la bibliothèque. Cela garantit un comportement cohérent de vos scripts dans différentes configurations [3].

Structure de script de base

Voici un modèle de script Puppeteer simple :

import puppeteer from 'puppeteer';

async function runAutomation() {
  const browser = await puppeteer.launch({
    headless: true
  });
  const page = await browser.newPage();

  try {
    await page.setViewport({ width: 1280, height: 800 });
    await page.goto('https://example.com');
    // Add your actions here
  } finally {
    await browser.close();
  }
}

runAutomation();

Bonnes pratiques pour écrire des scripts Puppeteer :

  • Utilisez page.waitForSelector() pour vous assurer que les éléments sont entièrement chargés avant d’interagir avec eux [4].
  • Définissez les dimensions de la fenêtre d’affichage pour un rendu des pages cohérent.
  • Encapsulez votre code dans des blocs try/finally afin de gérer les erreurs et de garantir la fermeture correcte du navigateur.
  • Fermez toujours l’instance du navigateur pour éviter les problèmes de mémoire [2].

Pour une expérience de développement plus fluide, ajoutez "type": "module" à votre fichier package.json. Vous pourrez ainsi utiliser la syntaxe moderne des modules ES, comme import et export, dans vos scripts [4]. Une fois cette configuration en place, vous êtes prêt à explorer les fonctionnalités avancées de Puppeteer dans les sections suivantes.

Principales fonctionnalités de Puppeteer

Examinons les fonctionnalités clés de Puppeteer pour une automatisation efficace des navigateurs.

Bases du contrôle de navigateur

Puppeteer vous permet d’exécuter les navigateurs dans deux modes :

ModeDescriptionMeilleur cas d’usage
HeadlessExécute le navigateur de manière invisibleAutomatisation dans les pipelines CI/CD, tâches de production
CompletAffiche l’interface utilisateur du navigateurDébogage, tests de développement

Voici un exemple rapide de lancement d’un navigateur avec des paramètres personnalisés :

const browser = await puppeteer.launch({
  headless: true,
  defaultViewport: { width: 1920, height: 1080 },
  args: ['--no-sandbox', '--disable-setuid-sandbox']
});

Méthodes d’interaction avec les pages

Puppeteer facilite l’interaction avec les pages web grâce aux sélecteurs CSS et aux fonctions d’attente intégrées qui vérifient que les éléments sont prêts. Par exemple :

// Wait for the email input field to load and type an email
const emailInput = await page.waitForSelector('input[type="email"]');
await emailInput.type('[email protected]');

// Wait for the submit button to appear and click it
const submitButton = await page.waitForSelector('button[type="submit"]');
await submitButton.click();

Vous pouvez effectuer diverses actions, notamment :

  • Événements de souris : cliquer, survoler ou effectuer un glisser-déposer.
  • Saisie au clavier : saisir du texte ou utiliser des combinaisons de touches.
  • Gestion des formulaires : utiliser des listes déroulantes, des cases à cocher et des téléchargements de fichiers.
  • Navigation entre les cadres : interagir avec des iframes ou basculer entre plusieurs fenêtres.

Gestion des opérations asynchrones

Puppeteer reposant sur des opérations asynchrones, il est essentiel de gérer correctement ces tâches. Le framework inclut des mécanismes d’attente pour assurer une automatisation fluide. Voici un exemple :

try {
  await Promise.all([
    page.waitForNavigation(),
    page.click('#submit-button')
  ]);

  await page.waitForSelector('.success-message', {
    visible: true,
    timeout: 5000
  });
} catch (error) {
  console.error('Navigation failed:', error);
}

« Async/await vous permet d’écrire du code asynchrone qui ressemble davantage au code synchrone traditionnel, ce qui le rend souvent plus facile à lire et à comprendre. » - WebScraping.AI [5]

Voici quelques stratégies d’attente utiles :

Fonction d’attenteObjectifExemple d’utilisation
waitForSelectorAttend qu’un élément apparaisseUtile pour les formulaires ou le contenu dynamique
waitForNavigationAttend le chargement d’une pageIdéal pour les soumissions de formulaires
waitForFunctionAttend des conditions personnaliséesIdéal pour vérifier des changements d’état complexes
waitForTimeoutIntroduit un délai fixeUtile pour les limites de débit ou les animations
sbb-itb-23997f1

Exemples d’implémentation

Cette section présente des exemples pratiques montrant comment Puppeteer peut être utilisé pour des tâches telles que l’extraction de données, l’automatisation de formulaires et la capture efficace de pages web.

Méthodes d’extraction de données

Puppeteer simplifie la gestion du contenu dynamique et l’extraction de données structurées. Voici un exemple de scraping de données d’avis sur une page à défilement infini :

async function scrapeReviews() {
  const reviews = [];

  // Scroll until no new content loads
  async function scrollToBottom() {
    let lastHeight = await page.evaluate('document.body.scrollHeight');
    while (true) {
      await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
      await page.waitForTimeout(2000);
      let newHeight = await page.evaluate('document.body.scrollHeight');
      if (newHeight === lastHeight) break;
      lastHeight = newHeight;
    }
  }

  // Extract review data
  await scrollToBottom();
  const reviewElements = await page.$$('.review-box');
  for (const element of reviewElements) {
    const review = await element.evaluate(el => ({
      text: el.querySelector('.review-text').textContent,
      rating: el.querySelector('.rating').getAttribute('data-score'),
      date: el.querySelector('.review-date').textContent
    }));
    reviews.push(review);
  }

  return reviews;
}

Pour améliorer les performances lors du scraping, tenez compte de ces conseils :

OptimisationImplémentationAvantage
Désactiver les imagespage.setRequestInterception(true)Économise la bande passante
Utiliser le mode furtifpuppeteer-extra-plugin-stealthAide à éviter la détection
Ajouter des délaispage.waitForTimeout()Évite les limitations de débit

Passons maintenant à l’automatisation des formulaires.

Étapes d’automatisation des formulaires

L’automatisation des formulaires implique de remplir les champs de saisie, de gérer les boutons et de traiter les erreurs potentielles. Voici comment automatiser un formulaire de connexion avec une gestion des erreurs :

async function handleLogin(username, password) {
  try {
    // Click cookie accept button if visible
    const cookieButton = await page.$('.cookie-accept');
    if (cookieButton) await cookieButton.click();

    // Fill login form
    await page.type('#username', username, { delay: 100 });
    await page.type('#password', password, { delay: 100 });

    // Submit and wait for navigation
    await Promise.all([
      page.waitForNavigation(),
      page.click('#login-button')
    ]);

    // Check for error messages
    const errorElement = await page.$('.error-message-container');
    if (errorElement) {
      const errorText = await errorElement.evaluate(el => el.textContent);
      throw new Error(`Login failed: ${errorText}`);
    }

  } catch (error) {
    console.error('Login automation failed:', error);
  }
}

Outils de capture de pages

Pour capturer des pages web, Puppeteer vous permet de configurer les paramètres des captures d’écran et des PDF. Voici un exemple de création de captures de haute qualité :

async function captureWebPage(url) {
  // Set viewport for consistent captures
  await page.setViewport({
    width: 1920,
    height: 1080,
    deviceScaleFactor: 2
  });

  await page.goto(url, { waitUntil: 'networkidle0' });

  // Take full-page screenshot
  await page.screenshot({
    path: 'capture.jpg',
    fullPage: true,
    quality: 90,
    type: 'jpeg'
  });

  // Generate PDF with custom settings
  await page.pdf({
    path: 'page.pdf',
    format: 'A4',
    printBackground: true,
    margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' }
  });
}

« Réaliser des captures d’écran de sites web avec Puppeteer peut s’avérer délicat. De nombreux pièges nous attendent. » - Dmytro Krasun, auteur chez ScreenshotOne [6]

Pour de meilleurs résultats, adaptez vos paramètres de capture selon la tâche :

Type de captureBonne pratiqueCas d’usage idéal
Captures d’écranUtiliser JPEG pour un traitement plus rapideCaptures web générales
PDFAppliquer du CSS pour les médias d’impressionCréation de documents
Capture d’élémentCibler des sélecteurs spécifiquesTest de composants individuels

Ces exemples montrent comment Puppeteer peut simplifier diverses tâches d’automatisation.

Fonctionnalités avancées et performances

Puppeteer propose de nombreuses techniques avancées qui peuvent améliorer vos projets Node.js. Voyons comment améliorer les tests, gérer plusieurs pages et optimiser les performances.

Tests et gestion des erreurs

Une gestion efficace des erreurs dans Puppeteer peut grandement simplifier le débogage. En surveillant les processus du navigateur et en enregistrant les requêtes échouées, vous pouvez rapidement identifier et résoudre les problèmes. Voici un exemple de configuration robuste de gestion des erreurs :

async function robustPageOperation(url) {
  try {
    await page.goto(url, { 
      waitUntil: 'domcontentloaded',  // Faster than 'networkidle2'
      timeout: 30000 
    });

    // Monitor failed requests
    page.on('requestfailed', request => {
      console.error(`Failed request: ${request.url()}`);
      console.error(`Reason: ${request.failure().errorText}`);
    });

    // Capture a screenshot on error for debugging
    page.on('error', async (error) => {
      await page.screenshot({
        path: `error-${Date.now()}.png`,
        fullPage: true
      });
      console.error('Page error:', error);
    });

  } catch (error) {
    console.error('Navigation failed:', error);
    throw error;
  }
}

« Cela ne résoudra pas tous vos problèmes, mais vous donnera suffisamment de visibilité sur la situation pour diagnostiquer et corriger les problèmes beaucoup plus facilement. » - Joel Griffith, fondateur et CEO de browserless.io [8]

Une fois la gestion des erreurs configurée, vous pouvez aller plus loin en gérant plusieurs pages simultanément.

Opérations sur plusieurs pages

Puppeteer vous permet de gérer plusieurs tâches simultanément, ce qui peut faire gagner du temps et améliorer l’efficacité. Voici un exemple de gestion de tâches concurrentes avec Puppeteer Cluster :

const { Cluster } = require('puppeteer-cluster');

async function runParallelOperations() {
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_CONTEXT,
    maxConcurrency: 4,
    monitor: true,
    timeout: 30000
  });

  await cluster.task(async ({ page, data: url }) => {
    await page.goto(url);
    // Perform page operations
  });

  // Queue URLs for processing
  const urls = ['url1', 'url2', 'url3'];
  for (const url of urls) {
    await cluster.queue(url);
  }

  await cluster.idle();
  await cluster.close();
}

Une gestion efficace de plusieurs pages représente une avancée importante, mais l’optimisation de l’utilisation des ressources peut rendre vos opérations encore plus fluides.

Vitesse et gestion des ressources

Pour obtenir les meilleures performances de Puppeteer, concentrez-vous sur la réduction des temps de chargement et la gestion efficace des ressources. Voici quelques stratégies :

Approche d’optimisationImplémentationAvantage
Vitesse de chargement des pagesDésactiver les images et le CSSTemps de chargement plus rapides
Utilisation de la mémoireLibérer rapidement les pagesÉvite les fuites de mémoire
Gestion des requêtesMettre les réponses en cacheRéduit la charge réseau
Traitement parallèleConcurrence contrôléeUtilisation équilibrée des ressources

Voici un exemple d’optimisation des opérations sur les pages :

async function optimizedPageOperation() {
  // Intercept and optimize requests
  await page.setRequestInterception(true);
  page.on('request', request => {
    if (request.resourceType() === 'image' || request.resourceType() === 'stylesheet') {
      request.abort();
    } else {
      request.continue();
    }
  });

  // Implement caching
  const cache = new Map();
  page.on('response', async response => {
    const url = response.url();
    if (response.ok() && !cache.has(url)) {
      cache.set(url, await response.text());
    }
  });
}

Guide d’intégration Node.js

Découvrez comment intégrer facilement Puppeteer à vos projets Node.js avec une structure de code claire et maintenable.

Organisation du code

Structurez vos modules d’automatisation pour plus de clarté et de réutilisabilité. Voici un exemple de configuration :

// automation/browser.js
const puppeteer = require('puppeteer');

class BrowserManager {
  async initialize() {
    this.browser = await puppeteer.launch({
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox']
    });
    return this.browser;
  }

  async createPage() {
    const page = await this.browser.newPage();
    await page.setDefaultNavigationTimeout(30000);
    return page;
  }

  async cleanup() {
    if (this.browser) {
      await this.browser.close();
    }
  }
}

module.exports = new BrowserManager();

Cette configuration sépare les responsabilités, ce qui facilite la gestion et la mise à l’échelle de votre code.

Intégration de bibliothèques

Puppeteer peut fonctionner avec d’autres bibliothèques Node.js pour améliorer vos workflows d’automatisation. Voici un exemple utilisant winston pour la journalisation et puppeteer-extra pour les fonctionnalités de furtivité :

const winston = require('winston');
const puppeteerExtra = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Set up logging with winston
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: 'automation.log' })
  ]
});

// Configure Puppeteer with stealth mode
puppeteerExtra.use(StealthPlugin());

async function setupAutomation() {
  const browser = await puppeteerExtra.launch();
  const page = await browser.newPage();

  // Log browser console messages
  page.on('console', message => {
    logger.info(`Browser console: ${message.text()}`);
  });

  return { browser, page };
}

« Puppeteer est une bibliothèque Node.js qui fournit une API de haut niveau pour contrôler Chrome ou Chromium via le DevTools Protocol. » [2]

En intégrant des fonctionnalités de journalisation et de furtivité, vous pouvez mieux surveiller et gérer vos tâches d’automatisation.

Étapes de déploiement en production

Pour déployer des scripts Puppeteer, assurez-vous que votre environnement est optimisé pour la stabilité et les performances. Voici les principales étapes :

Étape de déploiementDétails de l’implémentationObjectif
DépendancesInstaller les dépendances de ChromeGarantit le fonctionnement du navigateur
Configuration du cacheConfigurer le répertoire .cache/puppeteerGère les instances de navigateur
Limites de ressourcesConfigurer les limites de mémoire et de CPUÉvite la surcharge du système
Récupération après erreurMettre en œuvre des mécanismes de redémarrage automatiqueMaintient la disponibilité du service

Utilisez la configuration suivante pour standardiser votre déploiement :

const { join } = require('path');

module.exports = {
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
  executablePath: process.env.CHROME_PATH || null,
  defaultViewport: {
    width: 1920,
    height: 1080
  }
};

Pour optimiser davantage vos scripts :

  • Fermez les pages inutilisées et les instances de navigateur dès que possible.
  • Utilisez des blocs try/catch pour gérer les erreurs et les enregistrer efficacement.
  • Surveillez l’utilisation de la mémoire et les temps de réponse pour éviter les goulots d’étranglement.
  • Configurez des en-têtes de sécurité et des contrôles d’accès afin de protéger votre environnement.

« En optimisant votre script Puppeteer, vous pouvez garantir un fonctionnement fluide et efficace avec des résultats précis et cohérents. » - ScrapeOps [7]

Résumé

Vue d’ensemble des fonctionnalités

Puppeteer est un outil d’automatisation de navigateur qui excelle dans des tâches telles que le contrôle de navigateur headless, l’automatisation de formulaires, les tests d’interface utilisateur, la capture de captures d’écran, la génération de PDF et les fonctionnalités de scraping web[1].

Voici un aperçu rapide de ses fonctionnalités principales :

FonctionnalitéCapacitéAvantages
Prise en charge des navigateursChrome/Chromium, FirefoxFonctionne dans plusieurs environnements
Mode d’exécutionHeadless/avec interfaceAdapté à divers cas d’usage
PerformancesFonctionnement légerUtilise moins de ressources système
Accès APIDevTools ProtocolOffre un contrôle détaillé du navigateur

Vous pouvez tirer le meilleur parti de ces fonctionnalités en suivant des stratégies spécifiques adaptées à vos besoins.

Guide d’implémentation

Pour maximiser le potentiel de Puppeteer, envisagez les stratégies suivantes afin d’améliorer les performances et la fiabilité :

Gestion des ressources

Le script suivant désactive les ressources inutiles telles que les images, les feuilles de style et les polices afin d’améliorer la vitesse de chargement des pages :

// Optimize page load performance
await page.setRequestInterception(true);
page.on('request', request => {
  if (['image', 'stylesheet', 'font'].indexOf(request.resourceType()) !== -1) {
    request.abort();
  } else {
    request.continue();
  }
});

Prévention des erreurs

Utilisez cet extrait pour vous assurer que votre script attend qu’un élément apparaisse avant d’interagir avec lui :

await page.waitForSelector('#target-element', {
  timeout: 5000,
  visible: true
});

Pour les configurations de production, suivez ces étapes :

  1. Configuration de l’infrastructure : installez les dépendances Chrome nécessaires et configurez correctement les répertoires de cache.
  2. Optimisations des performances : réduisez l’utilisation des ressources en désactivant les éléments inutiles et en activant l’interception des requêtes.
  3. Renforcement de la sécurité : ajoutez le plugin puppeteer-extra-plugin-stealth afin de réduire les risques de détection[7].
  4. Mise à l’échelle : utilisez puppeteer-cluster pour le traitement parallèle afin de gérer efficacement des volumes de travail plus importants[7].

« En optimisant votre script Puppeteer, vous pouvez garantir un fonctionnement fluide et efficace avec des résultats précis et cohérents. » - ScrapeOps [7]

References

FAQ

Frequently Asked Questions

Puppeteer est une bibliothèque Node.js qui automatise les tâches de navigateur via le protocole DevTools. Ses usages courants incluent le scraping web, la génération de PDF, les captures d’écran, l’automatisation de formulaires et les tests d’interface utilisateur en mode navigateur headless ou avec interface graphique.

Cela vous a aidé ? Partagez-le →

Écrit par

Vasiliy Datsenko

Responsable du support client

Vasiliy Datsenko est responsable du support client chez Latenode et un rédacteur en automatisation axé sur les produits. Son travail relie les conversations clients, la recherche sur l'automatisation des flux de travail, les cas d'utilisation de l'IA et la formation pratique sur les produits pour les équipes cherchant à automatiser des processus métier réels.

Profil de l'auteur →

Vérifié par

Oleg Zankov

PDG de Latenode, expert en no-code

Avec une philosophie ancrée dans l'innovation, la résolution de problèmes et l'expérience utilisateur, je me consacre à donner aux équipes les moyens de créer des intégrations sur mesure et d'automatiser les workflows avec facilité et efficacité. Fort d'une riche expérience en développement commercial, entrepreneurship technologique et développement logiciel, j'ai reconnu le besoin d'une solution d'intégration plus accessible, évolutive et adaptable. Ainsi est né Latenode.com. Grâce à notre plateforme, les entreprises peuvent exploiter la puissance de la technologie sans nécessiter de compétences approfondies en codage. Passionné par la création d'un avenir où la technologie nous sert, et non l'inverse, ma mission est de simplifier les processus complexes. Je crois en la démocratisation de la technologie et en dotant les équipes des outils nécessaires pour innover, croître et réussir dans un monde de plus en plus numérique.

Profil de l'auteur →

Continuer la lecture