Latenode

Automação de navegador com Puppeteer e JavaScript: implementação prática em Node.js

Veja como automatizar tarefas no navegador com Puppeteer em Node.js, da extração de dados da web à automação de formulários, com exemplos práticos e boas práticas.

10 min de leitura
Código JavaScript automatizando interações em um navegador com Puppeteer

Puppeteer é uma Node.js library que automatiza tarefas no navegador, como web scraping, testes de UI e fluxos repetitivos. Ele funciona tanto no modo headless (sem interface) quanto no modo de navegador completo e se comunica com os navegadores pelo DevTools Protocol. Veja por que é uma das principais escolhas dos desenvolvedores:

  • Processamento de conteúdo dinâmico: Ideal para apps web modernos e para contornar sistemas de detecção.
  • Usos comuns: Web scraping, geração de PDFs, captura de screenshots e automação de formulários.
  • Configuração simples: Instale o Puppeteer com npm install puppeteer; ele já inclui uma versão compatível do Chrome.

Exemplo rápido:

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

Por que ele se destaca:

  • Modos: Headless (tarefas de CI/CD) ou UI completa (depuração).
  • Interações com páginas: Automatize cliques, digitação e navegação usando seletores CSS.
  • Dicas de desempenho: Desative imagens, use o modo stealth e gerencie operações assíncronas com eficiência.

Do nível iniciante ao avançado, o Puppeteer simplifica a automação de navegadores, tornando-se uma ferramenta indispensável para desenvolvedores Node.js.

Testes e automação web modernos com Puppeteer (Google ...

Configuração e instalação iniciais

Siga estas etapas para configurar o Puppeteer no Node.js e deixar tudo pronto para a automação.

Configurando o ambiente Node.js

Para começar, você precisará de três componentes principais:

ComponenteFinalidadeComando de verificação
Node.jsAmbiente de execuçãonode --version
npmGerenciador de pacotesnpm --version
Google ChromeMecanismo do navegadorVerifique a instalação

Como o npm já vem incluído com o Node.js, ao instalar o Node.js você obtém as duas ferramentas. Baixe a versão mais recente de Long Term Support (LTS) no site oficial do Node.js para ter maior estabilidade e compatibilidade [2].

Configuração do projeto com Puppeteer

Veja como criar um novo projeto com Puppeteer:

  • Etapa 1: Execute mkdir puppeteer-project para criar uma pasta de projeto.
  • Etapa 2: Acesse a pasta e inicialize-a com cd puppeteer-project && npm init -y.
  • Etapa 3: Instale o Puppeteer usando npm install puppeteer.

Ao instalar o Puppeteer, ele baixa automaticamente uma versão do Chrome for Testing compatível com a biblioteca. Isso garante que seus scripts tenham um comportamento consistente em diferentes configurações [3].

Estrutura básica de script

Veja um modelo simples de script do Puppeteer:

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

Práticas recomendadas para criar scripts com Puppeteer:

  • Use page.waitForSelector() para garantir que os elementos sejam totalmente carregados antes de interagir com eles [4].
  • Defina as dimensões da viewport para manter uma renderização consistente da página.
  • Envolva seu código em blocos try/finally para lidar com erros e garantir que o navegador seja fechado corretamente.
  • Sempre feche a instância do navegador para evitar problemas de memória [2].

Para uma experiência de desenvolvimento mais fluida, adicione "type": "module" ao arquivo package.json. Isso permite usar sintaxe moderna de módulos ES, como import e export, em seus scripts [4]. Com essa configuração pronta, você pode explorar os recursos avançados do Puppeteer nas próximas seções.

Principais recursos do Puppeteer

Vamos detalhar os principais recursos do Puppeteer para uma automação eficiente de navegadores.

Fundamentos do controle de navegador

O Puppeteer permite executar navegadores em dois modos:

ModoDescriçãoMelhor caso de uso
HeadlessExecuta o navegador de forma invisívelAutomação em pipelines de CI/CD, tarefas de produção
CompletoExibe a UI do navegadorDepuração, testes de desenvolvimento

Veja um exemplo rápido de como iniciar um navegador com configurações personalizadas:

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

Métodos de interação com páginas

O Puppeteer facilita a interação com páginas web usando seletores CSS e funções de espera integradas para garantir que os elementos estejam prontos. Por exemplo:

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

Você pode realizar diversas ações, como:

  • Eventos do mouse: Clicar, passar o cursor ou arrastar e soltar.
  • Entrada pelo teclado: Digitar texto ou usar combinações de teclas.
  • Processamento de formulários: Trabalhar com listas suspensas, caixas de seleção e uploads de arquivos.
  • Navegação em frames: Interagir com iframes ou alternar entre várias janelas.

Gerenciando operações assíncronas

Como o Puppeteer é desenvolvido em torno de operações assíncronas, gerenciar essas tarefas corretamente é essencial. O framework inclui mecanismos de espera para garantir uma automação fluida. Veja um exemplo:

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 é uma forma de escrever código assíncrono que se parece mais com o código síncrono tradicional, o que muitas vezes facilita a leitura e o entendimento." - WebScraping.AI [5]

Algumas estratégias úteis de espera incluem:

Função de esperaFinalidadeExemplo de uso
waitForSelectorAguarda um elemento aparecerÚtil para formulários ou conteúdo dinâmico
waitForNavigationAguarda o carregamento de uma páginaIdeal para envios de formulário
waitForFunctionAguarda condições personalizadasÓtima para verificar mudanças de estado complexas
waitForTimeoutIntroduz um atraso fixoÚtil para limites de taxa ou animações
sbb-itb-23997f1

Exemplos de implementação

Esta seção apresenta exemplos práticos de como o Puppeteer pode ser usado em tarefas como extração de dados, automação de formulários e captura eficiente de páginas web.

Métodos de extração de dados

O Puppeteer simplifica o processamento de conteúdo dinâmico e a extração de dados estruturados. Abaixo está um exemplo de web scraping de dados de avaliações em uma página com rolagem infinita:

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

Para melhorar o desempenho durante o web scraping, considere estas dicas:

OtimizaçãoImplementaçãoBenefício
Desativar imagenspage.setRequestInterception(true)Economiza largura de banda
Usar modo stealthpuppeteer-extra-plugin-stealthAjuda a evitar detecção
Adicionar atrasospage.waitForTimeout()Evita limites de taxa

Agora, vamos passar para a automação de formulários.

Etapas de automação de formulários

Automatizar formulários envolve preencher campos de entrada, lidar com botões e gerenciar possíveis erros. Veja como automatizar um formulário de login com tratamento de erros:

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

Ferramentas de captura de páginas

Para capturar páginas web, o Puppeteer permite configurar opções para screenshots e PDFs. Veja um exemplo de criação de capturas de alta qualidade:

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

"Criar screenshots de sites com o Puppeteer pode ser complicado. Há muitas armadilhas no caminho." - Dmytro Krasun, autor do ScreenshotOne [6]

Para obter melhores resultados, adapte as configurações de captura conforme a tarefa:

Tipo de capturaPrática recomendadaCaso de uso ideal
ScreenshotsUse JPEG para processamento mais rápidoCapturas web gerais
PDFAplique CSS de mídia de impressãoCriação de documentos
Captura de elementoDirecione seletores específicosTeste de componentes individuais

Esses exemplos demonstram como o Puppeteer pode simplificar diversas tarefas de automação.

Recursos avançados e desempenho

O Puppeteer oferece diversas técnicas avançadas que podem aprimorar seus projetos Node.js. Veja como melhorar testes, gerenciar várias páginas e otimizar o desempenho.

Testes e gerenciamento de erros

Um tratamento de erros eficiente no Puppeteer pode simplificar bastante a depuração. Ao monitorar os processos do navegador e registrar solicitações com falha, você consegue identificar e resolver problemas rapidamente. Veja um exemplo de uma configuração robusta de gerenciamento de erros:

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

"Isso não resolverá todos os seus problemas, mas fornecerá consciência situacional suficiente para tornar o diagnóstico e a correção do problema muito mais fáceis." - Joel Griffith, fundador e CEO da browserless.io [8]

Depois de configurar o tratamento de erros, você pode avançar gerenciando várias páginas simultaneamente.

Operações com várias páginas

O Puppeteer permite lidar com várias tarefas ao mesmo tempo, o que pode economizar tempo e aumentar a eficiência. Veja um exemplo de gerenciamento de tarefas simultâneas com 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();
}

O gerenciamento eficiente de várias páginas é um grande avanço, mas otimizar o uso de recursos pode tornar suas operações ainda mais fluidas.

Velocidade e gerenciamento de recursos

Para obter o melhor desempenho do Puppeteer, concentre-se em reduzir os tempos de carregamento e gerenciar recursos com eficiência. Veja algumas estratégias:

Abordagem de otimizaçãoImplementaçãoBenefício
Velocidade de carregamento da páginaDesative imagens e CSSTempos de carregamento mais rápidos
Uso de memóriaDescarte páginas rapidamenteEvita vazamentos de memória
Gerenciamento de solicitaçõesArmazene respostas em cacheReduz a carga de rede
Processamento paraleloConcorrência controladaUso equilibrado de recursos

Veja um exemplo de como otimizar operações de página:

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

Guia de integração com Node.js

Aprenda a integrar o Puppeteer perfeitamente aos seus projetos Node.js com uma estrutura de código limpa e sustentável.

Organização do código

Mantenha seus módulos de automação estruturados para garantir clareza e reutilização. Veja uma configuração de exemplo:

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

Essa configuração separa responsabilidades, tornando seu código mais fácil de gerenciar e escalar.

Integração com bibliotecas

O Puppeteer pode trabalhar com outras bibliotecas Node.js para aprimorar seus fluxos de automação. Veja um exemplo que usa winston para logs e puppeteer-extra para recursos stealth:

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 é uma biblioteca Node.js que fornece uma API de alto nível para controlar o Chrome ou Chromium pelo DevTools Protocol." [2]

Ao integrar recursos de logs e stealth, você pode monitorar e gerenciar melhor suas tarefas de automação.

Etapas de implantação em produção

Ao implantar scripts do Puppeteer, garanta que seu ambiente esteja otimizado para estabilidade e desempenho. Veja as principais etapas:

Etapa de implantaçãoDetalhes da implementaçãoFinalidade
DependênciasInstale as dependências do ChromeGarante a funcionalidade do navegador
Configuração de cacheConfigure o diretório .cache/puppeteerGerencia instâncias do navegador
Limites de recursosConfigure restrições de memória e CPUEvita sobrecarga do sistema
Recuperação de errosImplemente mecanismos de reinicialização automáticaMantém a disponibilidade do serviço

Use a configuração a seguir para padronizar sua implantação:

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

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

Para otimizar ainda mais seus scripts:

  • Feche páginas e instâncias de navegador não utilizadas assim que possível.
  • Use blocos try/catch para lidar com erros e registrá-los com eficiência.
  • Monitore o uso de memória e os tempos de resposta para evitar gargalos.
  • Configure cabeçalhos de segurança e controles de acesso para proteger seu ambiente.

"Ao otimizar seu script do Puppeteer, você pode garantir uma operação fluida e eficiente, com resultados precisos e consistentes." - ScrapeOps [7]

Resumo

Visão geral dos recursos

O Puppeteer é uma ferramenta de automação de navegadores que se destaca em tarefas como controle de navegador headless, automação de formulários, testes de UI, captura de screenshots, geração de PDFs e recursos de web scraping [1].

Veja rapidamente seus recursos principais:

RecursoCapacidadeVantagens
Suporte a navegadoresChrome/Chromium, FirefoxFunciona em vários ambientes
Modo de execuçãoHeadless/com interfaceAdequado para diversos casos de uso
DesempenhoOperação leveUsa menos recursos do sistema
Acesso à APIDevTools ProtocolOferece controle detalhado do navegador

Você pode aproveitar ao máximo esses recursos seguindo estratégias específicas para suas necessidades.

Guia de implementação

Para maximizar o potencial do Puppeteer, considere estas estratégias para melhorar o desempenho e a confiabilidade:

Gerenciamento de recursos

O script a seguir desativa recursos desnecessários, como imagens, folhas de estilo e fontes, para melhorar a velocidade de carregamento da página:

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

Prevenção de erros

Use este trecho para garantir que seu script aguarde a exibição de um elemento antes de interagir com ele:

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

Para configurações de produção, siga estas etapas:

  1. Configuração da infraestrutura: Instale as dependências necessárias do Chrome e configure os diretórios de cache corretamente.
  2. Ajustes de desempenho: Minimize o uso de recursos desativando ativos desnecessários e ativando a interceptação de solicitações.
  3. Aprimoramentos de segurança: Adicione o plugin puppeteer-extra-plugin-stealth para reduzir os riscos de detecção [7].
  4. Escalabilidade: Use puppeteer-cluster para processamento paralelo e lidar com workloads maiores de forma eficiente [7].

"Ao otimizar seu script do Puppeteer, você pode garantir uma operação fluida e eficiente, com resultados precisos e consistentes." - ScrapeOps [7]

References

FAQ

Frequently Asked Questions

Puppeteer é uma biblioteca para Node.js que automatiza tarefas no navegador por meio do DevTools Protocol. Os usos mais comuns incluem extração de dados da web, geração de PDFs, capturas de tela, automação de formulários e testes de interface em modos de navegador headless ou com interface gráfica.

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