Latenode

Operações de clique no Puppeteer: como lidar com elementos complexos, cliques duplos e solução de problemas

Aprenda operações de clique eficazes com o Puppeteer, lidando com elementos complexos, conteúdo dinâmico e problemas comuns na automação web.

7 min de leitura
Ilustração de automação de cliques no navegador com o Puppeteer

Puppeteer simplifica a automação de navegadores, oferecendo ferramentas avançadas para clicar e interagir com elementos da web. Seja para lidar com cliques básicos, conteúdo dinâmico ou elementos complexos como iframes e sobreposições, o Puppeteer oferece tudo o que você precisa. Veja o que saber:

  • Cliques básicos: use page.click() ou a API Locator para interações padrão.
  • Conteúdo dinâmico: aguarde o carregamento dos elementos ou as respostas de AJAX antes de clicar.
  • Elementos complexos: manipule elementos ocultos, sobrepostos ou em iframes com scripts personalizados.
  • Ações avançadas: execute cliques duplos, cliques com o botão direito e operações de arrastar e soltar.
  • Tratamento de erros: corrija problemas comuns, como “Elemento não encontrado” ou erros de tempo, usando esperas e seletores precisos.
  • Dicas de estabilidade: use timeouts adequados, atrasos aleatórios e modo stealth para uma automação mais fluida.

O Puppeteer garante uma automação confiável com recursos como esperas integradas, suporte a shadow DOM e métodos avançados de clique. Continue lendo para ver exemplos detalhados e dicas de solução de problemas.

sbb-itb-23997f1

Experimente o navegador headless baseado em Puppeteer da Latenode para automação de navegadores!

A Latenode é uma plataforma de automação de aplicações que oferece integração direta com um navegador headless baseado em Puppeteer. Adicione código de qualquer complexidade, extraia dados de sites, capture screenshots e execute qualquer operação que você imaginar.

Não perca a oportunidade de melhorar, simplificar e acelerar a automação web. Experimente AGORA o navegador headless na Latenode!

Primeiros passos com comandos de clique

Vamos explorar como usar a simulação de cliques do Puppeteer com eficiência, começando por alguns exemplos práticos.

Método básico de clique

A função page.click() é o principal método do Puppeteer para disparar eventos de clique. Veja como usá-la:

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

Para uma abordagem mais flexível, você pode usar a API Locator do Puppeteer, introduzida na versão 13.0:

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

Quando os seletores CSS não atendem às suas necessidades, considere usar XPath.

XPath e seleção de elementos

O XPath pode ser uma alternativa avançada para selecionar elementos, especialmente quando os seletores CSS não são suficientes:

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

Depois de clicar, talvez seja necessário lidar com a navegação ou atualizações de conteúdo dinâmico. O Puppeteer torna isso simples:

// 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')
]);

Para aplicações de página única (SPAs), você pode monitorar mudanças específicas no estado da página:

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

Essas técnicas ajudam você a gerenciar cliques e seus resultados com mais eficiência nos seus scripts do Puppeteer.

Trabalhando com elementos complexos

Esta seção apresenta técnicas para lidar com elementos desafiadores que não respondem aos métodos de clique padrão.

Elementos ocultos e sobreposições

Às vezes, os elementos estão ocultos ou cobertos por sobreposições, o que impede o clique. Veja como ajustar suas propriedades para interagir com eles:

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

Cliques em conteúdo dinâmico

Lidar com elementos carregados dinamicamente exige aguardar até que eles possam receber cliques:

// 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
]);

Interações com iframe e hover

Interagir com elementos dentro de iframes ou que exigem ações de hover pode ser desafiador. Veja como lidar com eles:

// 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

Para interações de hover que revelam conteúdo adicional:

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

“Clica no primeiro elemento encontrado que corresponde a selector.” — Documentação do Puppeteer [2]

Esses métodos ajudam você a interagir de forma confiável com elementos web desafiadores, mantendo seus scripts estáveis e eficientes. A seguir, veremos técnicas avançadas de clique, como cliques duplos, cliques com o botão direito e ações de arrastar.

Métodos especiais de clique

O Puppeteer oferece diversas opções avançadas de clique, permitindo automatizar ações complexas do mouse com precisão.

Cliques duplos e com o botão direito

Para executar cliques duplos, você pode configurar as opções de clique conforme mostrado abaixo:

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

Para cliques com o botão direito, use a opção 'button' para especificar a ação:

// 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');

“Sim, todas essas interações ocorrem no nível do sistema operacional. Isso significa que elas estão fora do espaço do navegador/Puppeteer. Não há alternativa, pelo que sei.” — ebidel [3]

Além dessas ações, o Puppeteer também oferece suporte a interações de arrastar e soltar.

Ações de clicar e arrastar

Para executar ações de arrastar e soltar, coordene vários eventos do mouse para obter resultados precisos:

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

Para interações mais específicas, como sliders ou listas ordenáveis, você pode disparar eventos de arrastar personalizados:

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

Eventos de clique AJAX

O Puppeteer também gerencia cliques que acionam atualizações assíncronas, como solicitações AJAX. Use mecanismos de espera adequados para garantir a confiabilidade:

// 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')
]);

Para conteúdo dinâmico carregado via AJAX, você pode verificar as atualizações combinando eventos de clique com verificações de conteúdo:

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

Esses métodos permitem automatizar interações complexas do usuário, garantindo confiabilidade por meio do gerenciamento adequado de tempo e eventos.

Problemas comuns de clique e soluções

Esta seção aborda erros frequentes relacionados a cliques no Puppeteer e como resolvê-los com eficiência.

Corrigindo o erro “Elemento não encontrado”

O erro “Elemento não encontrado” ocorre quando o Puppeteer não consegue localizar o elemento-alvo. Para resolvê-lo, experimente usar seletores precisos, lidar com elementos de Shadow DOM ou garantir que os elementos ocultos estejam visíveis:

// 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');

Depois de resolver os problemas de seletor, questões relacionadas ao tempo ainda podem interferir nas operações de clique.

Resolvendo problemas de tempo

Problemas de tempo geralmente surgem quando os elementos não foram totalmente carregados ou não estão visíveis. Veja como lidar com eles:

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

Essas técnicas ajudam a sincronizar suas ações com o conteúdo dinâmico da página.

Lidando com desafios de segurança do navegador

Os recursos de segurança do navegador podem, às vezes, bloquear cliques automatizados. Para contornar essas restrições, você pode usar o modo stealth ou configurações seguras do 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'
  ]
});

Para maior isolamento e segurança:

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

“Sim, todas essas interações ocorrem no nível do sistema operacional. Isso significa que elas estão fora do espaço do navegador/Puppeteer. Não há alternativa, pelo que sei.” — ebidel [3]

Diretrizes para operações de clique

Configurações de espera e timeout

Configurações adequadas de espera e timeout são essenciais para garantir operações de clique confiáveis. Veja como gerenciá-las com eficiência:

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')
]);

Para conteúdo orientado por API, aguardar a inatividade da rede é fundamental:

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

Se as esperas integradas de clique não atenderem às suas necessidades, scripts personalizados podem lidar com situações mais complexas.

Métodos de clique personalizados em JavaScript

Em situações complexas, use page.evaluate() para executar scripts de clique personalizados. Veja alguns exemplos:

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

Esses métodos são particularmente úteis para:

  • Interagir com elementos de Shadow DOM
  • Lidar com conteúdo dinâmico ou oculto
  • Clicar em elementos atrás de sobreposições
  • Navegar por estruturas DOM complexas

Scripts personalizados como esses conseguem lidar com casos extremos que os métodos padrão talvez não cubram.

Dicas de velocidade e estabilidade

Depois de resolver os desafios de tempo e interação, concentre-se em melhorar a velocidade e a estabilidade para otimizar sua automação:

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

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

Para trabalhar com iframes:

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

Para garantir a confiabilidade:

  • Use seletores CSS para localizar elementos mais rapidamente
  • Envolva operações críticas em blocos try-catch
  • Monitore a atividade de rede para conteúdo dinâmico
  • Defina timeouts práticos para evitar atrasos desnecessários

Essas estratégias ajudam a criar fluxos de automação mais confiáveis e eficientes.

Resumo

O Puppeteer simplifica a automação web com sua variedade de operações de clique, oferecendo seleção precisa de alvos e vários métodos para lidar com diferentes situações. Veja um resumo rápido dos seus recursos de clique:

Tipo de cliqueMétodo de implementaçãoMelhor caso de uso
Clique básicopage.click('#element')Interações gerais com elementos
Clique duplopage.mouse.dblclick()Formulários, seleção de texto
Clique com o botão direitopage.mouse.click(x, y, { button: 'right' })Ativação de menus de contexto
Clique por coordenadaspage.mouse.click(x, y)Trabalho com canvas ou mapas

Esses métodos se integram facilmente aos fluxos de automação, resolvendo desafios comuns como o gerenciamento do estado dos elementos e problemas relacionados ao tempo. A API Locator do Puppeteer garante que os elementos estejam presentes e prontos antes da interação, reduzindo falhas de script causadas por erros de tempo [1].

Para páginas web complexas, o Puppeteer oferece suporte a seletores CSS avançados, incluindo aqueles voltados para shadow DOM, atributos ARIA e direcionamento baseado em texto. Isso o torna especialmente útil para conteúdo dinâmico, sobreposições e estruturas DOM complexas. Combinar esses seletores com os mecanismos de espera e tratamento de erros do Puppeteer garante uma automação fluida e consistente.

“Sim, todas essas interações ocorrem no nível do sistema operacional. Isso significa que elas estão fora do espaço do navegador/Puppeteer. Não há alternativa, pelo que sei.” — ebidel [3]

References

FAQ

Frequently Asked Questions

Use page.click() com um seletor CSS para cliques padrão ou a API Locator (page.getByRole), introduzida no Puppeteer 13, para uma seleção mais resiliente. Ambas oferecem suporte a opções como delay, tipo de botão, clickCount e timeout.

Isso foi útil? Compartilhe →

Escrito por

Vasiliy Datsenko

Head of Customer Support

Vasiliy Datsenko é Head of Customer Support na Latenode e um escritor de automação focado em produto. Seu trabalho conecta conversas com clientes, pesquisa de automação de fluxos de trabalho, casos de uso de IA e educação prática sobre produtos para equipes que tentam automatizar processos de negócios reais.

Perfil do autor →

Verificado por

Oleg Zankov

CEO da Latenode, Especialista em No-code

Com uma filosofia enraizada em inovação, resolução de problemas e experiência do usuário, estou focado em capacitar equipes a criar integrações personalizadas e automatizar fluxos de trabalho com facilidade e eficiência. Trazendo uma vasta experiência em desenvolvimento de negócios, empreendedorismo tecnológico e desenvolvimento de software, reconheci a necessidade de uma solução de integração mais acessível, escalável e adaptável. Assim, nasceu a Latenode.com. Com nossa plataforma, as empresas podem aproveitar o poder da tecnologia sem a necessidade de conhecimentos extensos em programação. Apaixonado por promover um futuro onde a tecnologia nos serve, e não o contrário, minha missão é tornar processos complexos simples. Acredito em democratizar a tecnologia e equipar as equipes com as ferramentas para inovar, crescer e ter sucesso em um mundo cada vez mais digital.

Perfil do autor →

Continue lendo