Une plateforme low-code alliant la simplicité du no-code à la puissance du full-code 🚀
Commencez gratuitement
Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage
15 mars 2025
9
min lire

Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage

Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage 35
Georges Miloradovitch
Chercheur, rédacteur et intervieweur de cas d'utilisation

Puppeteer simplifie l'automatisation du navigateur en proposant des outils puissants pour cliquer et interagir avec les éléments web. Que vous gériez des clics simples, du contenu dynamique ou des éléments complexes comme les iframes et les superpositions, Puppeteer est là pour vous. Voici ce que vous devez savoir :

  • Clics de base: Utilisation page.click() ou l'API Locator pour les interactions standard.
  • Contenu dynamique: Attendre que les éléments soient chargés ou AJAX réponses avant de cliquer.
  • Éléments délicats: Gérez les éléments masqués, superposés ou iframe avec des scripts personnalisés.
  • Actions avancées: Effectuez des doubles-clics, des clics droits et des opérations de glisser-déposer.
  • Gestion des erreurs : Corrigez les problèmes courants tels que « Élément non trouvé » ou les problèmes de synchronisation à l'aide d'attentes et de sélecteurs précis.
  • Conseils de stabilité:Utilisez des délais d'attente appropriés, des délais aléatoires et un mode furtif pour une automatisation plus fluide.

Puppeteer assure une automatisation fiable avec des fonctionnalités telles que les attentes intégrées, ombre DOM Assistance et méthodes de clic avancées. Consultez l'article pour des exemples détaillés et des conseils de dépannage.

sbb-itb-23997f1

Essayez le navigateur sans tête basé sur Puppeteer sur Latenode pour l'automatisation du navigateur !

Latenode est une plateforme d'automatisation d'applications qui s'intègre directement à un navigateur headless basé sur Puppeteer. Ajoutez du code de toute complexité, récupérez des données de sites web, prenez des captures d'écran et effectuez toutes les opérations imaginables.

Ne manquez pas l’occasion d’améliorer, de simplifier et d’accélérer l’automatisation Web. Essayez Headless Browser MAINTENANT sur Latenode !

Premiers pas avec les commandes de clic

Plongeons dans la manière dont vous pouvez utiliser efficacement la simulation de clic de Puppeteer, en commençant par quelques exemples pratiques.

Méthode de clic de base

Le page.click() La fonction est la méthode de référence de Puppeteer pour déclencher des événements de clic. Voici comment l'utiliser :

// Clicking an element by its selector
await page.click('#submit-button');

// Adding options to your click
await page.click('.menu-item', {
  delay: 100,           // Adds a delay before the click
  button: 'left',       // Specifies the mouse button
  clickCount: 1,        // Number of times to click
  timeout: 30000        // Maximum time to wait
});

Pour une approche plus flexible, vous pouvez utiliser l'API Locator de Puppeteer, introduite dans la version 13.0 :

const button = page.getByRole('button', { name: 'Submit' });
await button.click();

Lorsque les sélecteurs CSS ne répondent pas à vos besoins, pensez à utiliser XPath.

XPath et sélection d'éléments

XPath peut être une alternative puissante pour sélectionner des éléments, en particulier lorsque les sélecteurs CSS ne sont pas suffisants :

// Selecting an element with XPath
const element = await page.$x('//button[contains(text(), "Submit")]');
await element[0].click();

// Combining XPath with waiting
const submitButton = await page.waitForXPath(
  '//button[@class="submit-btn"]',
  { visible: true }
);
await submitButton.click();

Navigation post-clic

Après avoir cliqué, vous devrez peut-être gérer la navigation ou les mises à jour de contenu dynamique. Puppeteer simplifie cette tâche :

// Waiting for a page navigation after a click
await Promise.all([
  page.waitForNavigation({ waitUntil: 'networkidle0' }),
  page.click('#navigation-link')
]);

// Handling dynamic content loading
await Promise.all([
  page.waitForSelector('.new-content'),
  page.click('#load-more')
]);

Pour les applications monopages (SPA), vous pouvez surveiller les modifications spécifiques de l'état de la page :

await page.click('#update-button');
await page.waitForFunction(
  'document.querySelector(".status").textContent === "Updated"'
);

Ces techniques vous aideront à gérer plus efficacement les clics et leurs résultats dans vos scripts Puppeteer.

Travailler avec des éléments difficiles

Cette section explore les techniques de gestion des éléments délicats qui ne répondent pas aux méthodes de clic standard.

Éléments cachés et superposés

Parfois, certains éléments sont masqués ou recouverts par des superpositions, ce qui les rend impossibles à cliquer. Voici comment ajuster leurs propriétés pour interagir avec eux :

// Make a hidden element visible before clicking
await page.evaluate(() => {
  const button = document.querySelector('#hidden-button');
  button.style.display = 'block';
  button.scrollIntoView();
});
await page.click('#hidden-button');

// Handle elements blocked by overlays
await page.evaluate(() => {
  const overlay = document.querySelector('.modal-overlay');
  if (overlay) overlay.remove(); // Remove the overlay
  const target = document.querySelector('#target-button');
  target.style.zIndex = '9999'; // Bring the target element to the front
});

Clics sur le contenu dynamique

Traiter des éléments qui se chargent dynamiquement nécessite d'attendre qu'ils deviennent cliquables :

// Wait for a dynamically loaded element to appear and then click
const dynamicElement = await page.waitForSelector('.dynamic-content', {
  visible: true,
  timeout: 5000
});
await dynamicElement.click();

// Handle elements loaded via AJAX
await Promise.all([
  page.waitForResponse(response => 
    response.url().includes('/api/data')), // Wait for the AJAX response
  page.click('#load-more-button') // Trigger the AJAX call
]);

Interactions Iframe et survol

Interagir avec des éléments dans des iframes ou nécessitant un survol peut s'avérer complexe. Voici comment y remédier :

// Click elements within an iframe
const frame = page.frames().find(f => 
  f.url().includes('embedded-content'));
await frame.click('.iframe-button');

// Handle hover-triggered interactions
await page.hover('#menu-trigger'); // Hover over the trigger
await page.waitForSelector('.dropdown-content'); // Wait for the dropdown to appear
await page.click('.dropdown-item'); // Click the dropdown item

Pour les interactions de survol qui révèlent du contenu supplémentaire :

await page.hover('#interactive-element'); // Hover over the interactive element
await page.waitForFunction(() => {
  const element = document.querySelector('.hover-content');
  return window.getComputedStyle(element).opacity === '1'; // Wait for the content to become visible
});
await page.click('.hover-content .button'); // Click the revealed button

"Cliquez sur le premier élément trouvé qui correspond selector." - Documentation du marionnettiste

Ces méthodes vous aident à interagir de manière fiable avec des éléments web complexes tout en préservant la stabilité et l'efficacité de vos scripts. Nous aborderons ensuite des techniques de clic avancées comme le double-clic, le clic droit et le glisser-déposer.

Méthodes de clic spéciales

Puppeteer propose une gamme d'options de clic avancées, vous permettant d'automatiser des actions de souris complexes avec précision.

Double clic et clic droit

Pour effectuer des doubles-clics, vous pouvez configurer les paramètres de clic comme indiqué ci-dessous :

// Double-click using page.click()
await page.click('#target-element', { clickCount: 2 });

// Double-click using mouse coordinates
const element = await page.$('#target-element');
const rect = await element.boundingBox();
await page.mouse.click(rect.x + rect.width / 2, rect.y + rect.height / 2, {
  clickCount: 2,
  delay: 100 // Add a delay for stability
});

Pour les clics droits, utilisez le 'button' option pour spécifier l'action :

// Right-click on an element
await page.click('#context-menu-trigger', { button: 'right' });

// Navigate the context menu using keyboard inputs
await page.keyboard.press('ArrowDown');
await page.keyboard.press('Enter');

« Toutes ces interactions se font au niveau du système d'exploitation. Elles se situent donc en dehors de l'espace navigateur/marionnettiste. Il n'y a pas de solution de contournement, à ma connaissance. » - ebidel

En plus de cela, Puppeteer prend également en charge les interactions par glisser-déposer.

Actions de clic et de glissement

Pour effectuer un glisser-déposer, coordonnez plusieurs événements de souris pour obtenir des résultats précis :

// Drag-and-drop example
async function dragAndDrop(page, sourceSelector, targetSelector) {
  const source = await page.$(sourceSelector);
  const target = await page.$(targetSelector);

  const sourceBound = await source.boundingBox();
  const targetBound = await target.boundingBox();

  await page.mouse.move(
    sourceBound.x + sourceBound.width / 2,
    sourceBound.y + sourceBound.height / 2
  );
  await page.mouse.down();
  await page.waitForTimeout(100);

  await page.mouse.move(
    targetBound.x + targetBound.width / 2,
    targetBound.y + targetBound.height / 2,
    { steps: 10 }
  );
  await page.waitForTimeout(100);
  await page.mouse.up();
}

Pour des interactions plus spécifiques comme des curseurs ou des listes triables, vous pouvez envoyer des événements de glissement personnalisés :

// Trigger custom drag events
await page.evaluate((sourceSelector) => {
  const element = document.querySelector(sourceSelector);
  element.dispatchEvent(new MouseEvent('dragstart', {
    bubbles: true,
    cancelable: true
  }));
}, sourceSelector);

AJAX Cliquez sur les événements

Puppeteer gère également les clics qui déclenchent des mises à jour asynchrones, comme les requêtes AJAX. Utilisez des mécanismes d'attente appropriés pour garantir la fiabilité :

// Wait for an AJAX response after a click
await Promise.all([
  page.waitForResponse(
    response => response.url().includes('/api/endpoint')
  ),
  page.click('#ajax-button')
]);

// Handle multiple AJAX requests simultaneously
const [response1, response2] = await Promise.all([
  page.waitForResponse(res => res.url().includes('/api/data1')),
  page.waitForResponse(res => res.url().includes('/api/data2')),
  page.click('#multi-ajax-trigger')
]);

Pour le contenu dynamique chargé via AJAX, vous pouvez vérifier les mises à jour en combinant les événements de clic avec les vérifications de contenu :

// Verify dynamic content loaded after clicking
await page.click('#load-more');
await page.waitForFunction(
  selector => document.querySelector(selector).children.length > 10,
  {},
  '.dynamic-content'
);

Ces méthodes vous permettent d’automatiser les interactions complexes des utilisateurs tout en garantissant la fiabilité grâce à une gestion appropriée du timing et des événements.

Problèmes de clic courants et solutions

Cette section explore les erreurs fréquentes liées aux clics dans Puppeteer et comment les résoudre efficacement.

Correction de l'erreur « Élément introuvable »

L'erreur « Élément introuvable » se produit lorsque Puppeteer ne parvient pas à localiser l'élément cible. Pour résoudre ce problème, essayez d'utiliser des sélecteurs précis, de gérer les éléments Shadow DOM ou de vous assurer que les éléments masqués sont visibles :

// Use specific selectors
const button = await page.waitForSelector('#submit-form-button', {
  visible: true,
  timeout: 5000
});

// Handle elements inside a Shadow DOM
await page.evaluate((selector) => {
  const root = document.querySelector('#shadow-host').shadowRoot;
  const element = root.querySelector(selector);
  element.click();
}, '#target-button');

// Make hidden elements visible and scroll into view
await page.evaluate((selector) => {
  const element = document.querySelector(selector);
  element.scrollIntoView();
  element.style.display = 'block';
}, '#hidden-element');

Une fois que vous avez résolu les problèmes de sélecteur, les problèmes liés au timing peuvent toujours interférer avec les opérations de clic.

Résoudre les problèmes de synchronisation

Des problèmes de synchronisation surviennent souvent lorsque les éléments ne sont pas entièrement chargés ou visibles. Voici comment les résoudre :

// Wait for navigation and element visibility before clicking
await Promise.all([
  page.waitForNavigation({ waitUntil: 'networkidle0' }),
  page.waitForSelector('#dynamic-content', { visible: true }),
  page.click('#trigger-button')
]);

// Add random delays to simulate real user behavior
const delay = Math.floor(Math.random() * (3000 - 1000 + 1)) + 1000;
await page.waitForTimeout(delay);

Ces techniques permettent de synchroniser vos actions avec le contenu dynamique de la page.

Relever les défis de sécurité des navigateurs

Les fonctionnalités de sécurité du navigateur peuvent parfois bloquer les clics automatisés. Pour contourner ces restrictions, vous pouvez utiliser le mode furtif ou les configurations sécurisées de Puppeteer :

// Enable stealth mode with puppeteer-extra
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({
  headless: false,
  ignoreHTTPSErrors: true,
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-sync',
    '--ignore-certificate-errors',
    '--lang=en-US,en;q=0.9'
  ]
});

Pour plus d’isolement et de sécurité :

const { launch } = require('secure-puppeteer');
const browser = await launch({
  isolateGlobalScope: true,
  interceptFetch: true
});

« Toutes ces interactions se font au niveau du système d'exploitation. Elles se situent donc en dehors de l'espace navigateur/marionnettiste. Il n'y a pas de solution de contournement, à ma connaissance. » - ebidel

Cliquez sur les directives d'utilisation

Paramètres d'attente et de délai d'expiration

Des configurations d'attente et de délai d'expiration appropriées sont essentielles pour garantir la fiabilité des clics. Voici comment les gérer efficacement :

await page.setDefaultTimeout(60000);

await page.waitForSelector('#loginBtn', {
  visible: true,
  timeout: 30000
});

await Promise.all([
  page.waitForNavigation({ waitUntil: 'networkidle0' }),
  page.waitForSelector('#dynamic-content'),
  page.click('#trigger-button')
]);

Pour le contenu piloté par API, il est crucial d'attendre que le réseau soit inactif :

await Promise.all([
  page.waitForNetworkIdle(),
  page.click('#fetchUsers')
]);

Si les attentes de clic intégrées ne répondent pas à vos besoins, des scripts personnalisés peuvent gérer des scénarios plus complexes.

Méthodes de clic JavaScript personnalisées

Dans les situations complexes, utilisez page.evaluate() pour exécuter des scripts de clic personnalisés. Voici quelques exemples :

const shadowClick = await page.evaluate(() => {
  const root = document.querySelector('#shadow-host').shadowRoot;
  const button = root.querySelector('#shadow-button');
  return button.click();
});

await page.evaluate(() => {
  const element = document.querySelector('#obscured-button');
  element.style.zIndex = '999999';
  element.click();
});

Ces méthodes sont particulièrement utiles pour :

  • Interaction avec les éléments Shadow DOM
  • Gestion du contenu dynamique ou caché
  • Cliquer sur les éléments derrière les superpositions
  • Naviguer dans des structures DOM complexes

Des scripts personnalisés comme ceux-ci peuvent gérer des cas extrêmes que les méthodes standard pourraient ne pas couvrir.

Conseils de vitesse et de stabilité

Après avoir résolu les problèmes de timing et d'interaction, concentrez-vous sur l'amélioration de la vitesse et de la stabilité pour optimiser votre automatisation :

const delay = Math.floor(Math.random() * (2000 - 500)) + 500;
await page.waitForTimeout(delay);

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

Pour travailler avec des iframes :

const frame = page.frames().find(f => f.name() === 'content-frame');
await frame.waitForSelector('#frame-button');
await frame.click('#frame-button');

Pour garantir la fiabilité :

  • Utilisez les sélecteurs CSS pour un ciblage plus rapide des éléments
  • Envelopper les opérations critiques dans des blocs try-catch
  • Surveiller l'activité du réseau pour le contenu dynamique
  • Définissez des délais d'attente pratiques pour éviter les retards inutiles

Ces stratégies contribuent à créer des flux de travail d’automatisation plus fiables et plus efficaces.

Résumé

Puppeteer simplifie l'automatisation web grâce à sa gamme d'opérations de clic, offrant un ciblage précis et de multiples méthodes pour gérer différents scénarios. Voici un bref aperçu de ses fonctionnalités de clic :

Cliquez sur Type Méthode de mise en œuvre Meilleur cas d'utilisation
Clic de base page.click('#element') Interactions générales entre éléments
Double clic page.mouse.dblclick() Formulaires, sélection de texte
Clic droit page.mouse.click(x, y, { button: 'right' }) Activation des menus contextuels
Coordonnée Cliquez page.mouse.click(x, y) Travailler avec des toiles ou des cartes

Ces méthodes s'intègrent parfaitement aux workflows d'automatisation, répondant ainsi aux défis courants tels que la gestion de l'état des éléments et les problèmes de timing. L'API Locator de Puppeteer garantit que les éléments sont présents et prêts avant l'interaction, réduisant ainsi les échecs de script dus à des erreurs de timing.

Pour les pages Web complexes, Puppeteer prend en charge les sélecteurs CSS avancés, y compris ceux pour Shadow DOM, AIR attributs et ciblage textuel. Cela le rend particulièrement utile pour le contenu dynamique, les superpositions et les structures DOM complexes. La combinaison de ces sélecteurs avec les mécanismes d'attente et de gestion des erreurs de Puppeteer garantit une automatisation fluide et cohérente.

« Toutes ces interactions se font au niveau du système d'exploitation. Elles se situent donc en dehors de l'espace navigateur/marionnettiste. Il n'y a pas de solution de contournement, à ma connaissance. » - ebidel

À lire également

Blogs connexes

Cas d'utilisation

Soutenu par
Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage 40
Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage 41
Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage 42
Opérations de clic du marionnettiste : gestion des éléments complexes, doubles clics et dépannage 43