Latenode

Dominando a navegação de páginas com Puppeteer: uso eficaz de goto e opções de navegação

Explore estratégias eficazes para usar o método page.goto() do Puppeteer e otimizar a navegação na web e as tarefas de automação.

8 min de leitura
Navegador automatizado com Puppeteer acessando páginas e gerenciando opções de navegação

O Puppeteer simplifica a automação web ao oferecer ferramentas para controlar os navegadores Chrome e Chromium. O método page.goto() é essencial para navegar pelas páginas com eficiência, seja para testes, scraping ou automação de tarefas. Veja o que você encontrará:

Visão geral rápida das opções de espera

Opção de esperaIdeal paraTempo (aprox.)
domcontentloadedVerificações de estrutura estática1 a 2 segundos
loadPáginas estáticas totalmente carregadas2 a 5 segundos
networkidle2Equilíbrio para conteúdo dinâmico3 a 8 segundos
networkidle0Páginas complexas e dinâmicas5 a 10 segundos

Principal conclusão: adapte as condições de espera e o tratamento de erros ao tipo de página para ter uma automação confiável. Explore métodos avançados para SPAs e processos de várias etapas para lidar com fluxos complexos de forma eficiente.

sbb-itb-23997f1

Como navegar para URLs específicas usando Puppeteer na Latenode?

A Latenode permite que você use um navegador headless com tecnologia Puppeteer diretamente nos seus fluxos de automação para configurar processos de análise de sites e monitoramento de páginas. Você pode encontrar facilmente a integração na biblioteca de nós, adicionar o código necessário e conectá-la a outros serviços — temos mais de 300 integrações de aplicativos disponíveis.

Experimente o template AGORA: Capture, analise e compartilhe insights de sites com navegador headless e ChatGPT

Diferentemente dos scrapers comuns, ele captura a estrutura visual real, reconhecendo tanto elementos de design quanto blocos de texto. Experimente agora o navegador headless neste template! Este fluxo não apenas captura e analisa dados de sites, mas também garante que você possa compartilhar insights facilmente para uma comunicação fluida.

  • Defina a URL: insira a URL do site que você deseja analisar para obter insights visuais.
  • Capture a tela: um navegador headless navega até o site e captura uma tela.
  • Analise com o ChatGPT: o ChatGPT analisa a captura de tela para extrair e resumir os principais insights.
  • Compartilhe insights: depois disso, integre seu mensageiro para enviar uma mensagem com a análise e receber detalhes claros diretamente na sua caixa de entrada.

Como usar page.goto() no Puppeteer?

O método page.goto() no Puppeteer é usado para navegar até URLs específicas.

Parâmetros do método

O método page.goto() aceita vários parâmetros para personalizar a navegação:

await page.goto(url, {
  timeout: 30000,
  waitUntil: 'networkidle0',
  referer: 'https://example.com'
});

Confira um detalhamento dos principais parâmetros:

  • url: a URL para a qual navegar. É obrigatória e pode ser um caminho absoluto ou relativo.
  • timeout: define o tempo máximo (em milissegundos) de espera para o carregamento da página. O padrão é 30.000 ms.
  • waitUntil: define quando a navegação é considerada concluída.
  • referer: define um cabeçalho referer personalizado para a solicitação.
Opção de esperaDescriçãoIdeal para
loadÉ acionado quando o evento de carregamento é disparado.Páginas estáticas simples de carregar.
domcontentloadedÉ disparado quando o HTML inicial é totalmente carregado.Verificações rápidas da estrutura da página.
networkidle0Aguarda até não haver atividade de rede por 500 ms.Páginas com conteúdo dinâmico ou complexo.
networkidle2Aguarda até que restem apenas 2 conexões de rede.Equilibra velocidade e profundidade.

Essas opções permitem controlar como e quando a página é considerada totalmente carregada, garantindo uma navegação precisa e confiável.

Tratamento da resposta

Depois de definir os parâmetros de navegação, o próximo passo é tratar a resposta. O método page.goto() retorna uma Promise que é resolvida em um objeto Response. Esse objeto fornece detalhes sobre a navegação:

const response = await page.goto(url);
if (response) {
  const status = response.status();
  const headers = response.headers();
  const ok = response.ok(); // true for status codes 200-299
}

Veja como verificar a navegação:

  • Verifique os códigos de status: use response.status() para confirmar o status HTTP.
  • Trate erros: use blocos try-catch para capturar navegações com falha.
  • Analise os cabeçalhos: acesse os cabeçalhos da resposta com response.headers().

Para tratar erros, envolva a chamada page.goto() em um bloco try-catch:

try {
  const response = await page.goto(url, { waitUntil: 'networkidle0' });
  if (!response.ok()) {
    throw new Error(`Page load failed with status: ${response.status()}`);
  }
} catch (error) {
  console.error('Navigation failed:', error);
}

O objeto de resposta inclui diversos métodos úteis:

  • response.status(): recupera o código de status HTTP.
  • response.headers(): busca os cabeçalhos da resposta.
  • response.securityDetails(): fornece detalhes de SSL/TLS.
  • response.timing(): oferece dados de tempo de navegação.

Essas ferramentas garantem que você possa validar a navegação e lidar com quaisquer problemas com eficiência.

Opções de carregamento de página

Ao trabalhar com os recursos de navegação do Puppeteer, escolher a estratégia de espera correta é fundamental para criar uma automação confiável. Seus scripts devem avançar apenas quando a página estiver totalmente pronta.

Condições de espera

O Puppeteer usa o parâmetro waitUntil para definir quando uma página é considerada carregada. Veja um exemplo:

const navigationOptions = { waitUntil: ['load', 'networkidle0'], timeout: 30000 };
await page.goto('https://example.com', navigationOptions);

Se você especificar várias condições de espera, o Puppeteer aguardará que todas ocorram antes de avançar. Confira as condições de espera comuns e seus tempos típicos:

Condição de esperaTempo aproximado
domcontentloaded1 a 2 segundos
load2 a 5 segundos
networkidle23 a 8 segundos
networkidle05 a 10 segundos

Escolha suas condições de espera com base na estrutura e na velocidade de carregamento da sua página.

Seleção de opções de espera

A condição de espera certa depende de você estar lidando com um site estático ou dinâmico:

// For a static site
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 });

// For a dynamic site
await page.goto(url, { waitUntil: 'networkidle0', timeout: 45000 });

Verifique se o valor de tempo limite corresponde à complexidade da condição de espera escolhida. Condições mais detalhadas, como networkidle0, podem exigir tempos limite maiores para evitar erros. Para tornar seu script ainda mais confiável, combine condições de espera com verificações adicionais.

Vários estados de espera

Para aumentar a precisão, você pode combinar condições de espera com verificações de elementos específicos:

await page.goto(url, { waitUntil: 'load' });
await page.waitForSelector('#main-content');
await page.waitForFunction(() => {
    return document.readyState === 'complete' && !document.querySelector('.loading-spinner');
});

Esse método garante que a página esteja completamente carregada e que elementos específicos estejam disponíveis. Ao fazer isso, você minimiza falhas nos testes e melhora a confiabilidade da sua automação.

Métodos de navegação complexa

Esta seção explica técnicas avançadas para gerenciar navegações complexas no Puppeteer. Com base nas estratégias básicas de navegação e espera abordadas anteriormente, esses métodos se concentram em lidar com situações mais desafiadoras.

Gerenciamento de erros

Lide com erros de navegação de forma eficaz combinando verificações de tempo limite com etapas de recuperação personalizadas:

const navigationPromise = page.goto(url);
const timeoutPromise = new Promise((_, reject) => 
    setTimeout(() => reject(new Error('Navigation timed out')), 45000)
);

try {
    await Promise.race([navigationPromise, timeoutPromise]);
} catch (error) {
    if (error instanceof TimeoutError) {
        await page.reload({ waitUntil: 'networkidle0' });
    } else {
        console.error(`Navigation failed: ${error.message}`);
        throw error;
    }
}

Essa abordagem garante que os tempos limite sejam gerenciados e que a página possa se recuperar ou recarregar conforme necessário.

Navegar em aplicações de página única (SPAs) requer uma estratégia diferente, que geralmente envolve mudanças de rota e comportamentos específicos do framework:

// Wait for the route to update
await page.waitForFunction(
    'window.location.pathname === "/dashboard"'
);

// React framework example
await page.click('[data-testid="nav-link"]');
await page.waitForFunction(() => {
    return document.querySelector('#react-root').__reactContainer !== null;
});

Esse método garante uma navegação fluida em SPAs ao aguardar mudanças específicas no estado da aplicação.

Para fluxos que envolvem várias etapas, você pode combinar técnicas de navegação para lidar com situações complexas:

async function complexNavigation(page, targetUrl) {
    // Load the initial page
    await page.goto(targetUrl);

    // Check for authentication completion
    await page.waitForSelector('#auth-complete');

    // Handle dynamic content
    await page.evaluate(() => {
        window.scrollTo(0, document.body.scrollHeight);
    });

    // Verify the page state
    await page.waitForFunction(() => {
        return window.performance.timing.loadEventEnd > 0;
    });
}

Para processos de várias etapas, você também pode usar navegação e ações em paralelo:

await page.goto(baseUrl);

await Promise.all([
    page.waitForNavigation({ waitUntil: 'networkidle0' }),
    page.click('button[type="submit"]')
]);

Essas técnicas simplificam a navegação em fluxos complexos, garantindo o tratamento eficiente de conteúdo dinâmico e processos de várias etapas.

Velocidade e desempenho

Aumentar a velocidade e a eficiência da navegação é essencial para criar fluxos de automação eficazes. Veja abaixo algumas técnicas práticas para melhorar o desempenho em diversas situações.

Uso do cache do navegador

Você pode configurar o tamanho do cache do navegador e gerenciar o armazenamento em cache com eficiência usando estas etapas:

const browser = await puppeteer.launch({
  args: ['--disk-cache-size=104857600'], // 100MB cache
  userDataDir: './cache-directory'
});

const context = await browser.createIncognitoBrowserContext();

await page._client.send('Network.clearBrowserCache');

await page.setCacheEnabled(true);
await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'document') {
    request.continue({
      headers: {
        ...request.headers(),
        'Cache-Control': 'max-age=3600'
      }
    });
  } else {
    request.continue();
  }
});

Depois de configurar o cache, você pode se concentrar no gerenciamento do carregamento de recursos para tornar a navegação ainda mais rápida.

Gerenciamento de recursos

Para reduzir o carregamento desnecessário de recursos, bloqueie itens não essenciais, como imagens e fontes:

await page.setRequestInterception(true);
page.on('request', request => {
  if (request.resourceType() === 'image' || request.resourceType() === 'font') {
    request.abort();
  } else {
    request.continue();
  }
});

Essa abordagem ajuda a economizar largura de banda e acelera as interações com a página.

Gerenciar várias abas com eficiência pode melhorar o desempenho ao aproveitar melhor os recursos disponíveis. Veja como administrar a navegação em diversas abas:

async function navigateMultipleTabs(urls) {
  const pages = await Promise.all(
    urls.map(async url => {
      const page = await browser.newPage();
      await page.setDefaultNavigationTimeout(30000);
      return page;
    })
  );

  await Promise.all(
    pages.map(async (page, index) => {
      try {
        await page.goto(urls[index], {
          waitUntil: 'networkidle0',
          timeout: 30000
        });
      } catch (error) {
        console.error(`Failed to load ${urls[index]}: ${error.message}`);
        await page.close();
      }
    })
  );

  return pages.filter(page => !page.isClosed());
}

Para evitar sobrecarregar os recursos, limite o número de abas abertas processando-as em lotes:

const maxConcurrentTabs = 3;
const tabPool = [];

for (let i = 0; i < urls.length; i += maxConcurrentTabs) {
  const batch = urls.slice(i, i + maxConcurrentTabs);
  const currentTabs = await navigateMultipleTabs(batch);
  tabPool.push(...currentTabs);

  await Promise.all(
    tabPool.map(async tab => {
      // Process each tab as needed
      await tab.close();
    })
  );

  tabPool.length = 0;
}

Esse método de processamento em lotes garante uma operação fluida sem sobrecarregar os recursos do sistema.

Conclusão

Principais conclusões

Para aproveitar ao máximo o método page.goto() do Puppeteer, concentre-se nestas estratégias práticas:

  • Use a Latenode: Experimente o navegador headless na Latenode para visitar URLs, capturar telas e analisar sites!
  • Estratégias de espera: adapte a opção waitUntil ao tipo da sua página para ter mais confiabilidade.
  • Tratamento de erros: use blocos try-catch e tempos limite para lidar com erros de navegação de forma eficaz.
  • Gerenciamento de recursos: ajuste as configurações de cache do navegador e gerencie o carregamento de recursos para melhorar o desempenho.
  • Aplicações de página única (SPAs): combine page.goto() com condições de espera personalizadas para lidar corretamente com mudanças de estado.

Essas abordagens se baseiam nas técnicas discutidas anteriormente, ajudando você a navegar por situações complexas e melhorar o desempenho. Veja como aplicá-las passo a passo:

Guia de implementação

1. Configure a navegação básica

const page = await browser.newPage();
await page.setDefaultNavigationTimeout(30000);
await page.goto(url, {
  waitUntil: 'networkidle0',
  timeout: 30000
});

2. Inclua o tratamento de erros

try {
  await page.goto(url, {
    waitUntil: ['load', 'networkidle0'],
    timeout: 30000
  });
} catch (error) {
  if (error instanceof TimeoutError) {
    await page.evaluate(() => window.stop());
    throw error;
  }
}

3. Otimize o carregamento de recursos

await page.setRequestInterception(true);
await page.setCacheEnabled(true);
page.on('request', request => {
  if (request.resourceType() === 'image') {
    request.abort();
  } else {
    request.continue();
  }
});

FAQ

Frequently Asked Questions

O método page.goto() direciona um navegador controlado pelo Puppeteer para uma URL especificada. Ele é essencial para tarefas de automação na web, como testes, scraping e fluxos com várias etapas, oferecendo opções de tempos limite, condições de espera e cabeçalhos de referenciador.

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