Uma plataforma de baixo código que combina a simplicidade sem código com o poder do código completo 🚀
Comece gratuitamente

Navegador sem cabeça em C#: configuração e exemplos de código

Índice
Navegador sem cabeça em C#: configuração e exemplos de código

Os navegadores headless permitem automatizar tarefas da web sem uma interface gráfica. Em C#, eles são amplamente usados ​​para testes, web scraping e gerenciamento de conteúdo. Duas ferramentas populares são Marionetista afiado (otimizado para Chrome/Chromium) e Selenium WebDriverName (suporta vários navegadores). Veja como eles se comparam:

Característica Marionetista afiado Selenium WebDriverName
Suporte do navegador Cromo / cromo Chrome, Firefox, Edge, etc.
Complexidade de configuração Fácil (download automático do Chromium) Requer configuração de driver separada
Desempenho Mais rápido para Chrome/Chromium Consistente em todos os navegadores
Design da API Moderno, baseado em promessas Tradicional, orientado a objetos
Uso da Memória Abaixe Varia de acordo com o navegador

Principais benefícios dos navegadores sem interface:

  • Velocidade: Testes mais rápidos sem renderização de GUI.
  • Eficiência: Usa menos memória e CPU.
  • Automação: Lida com tarefas como coleta de dados, testes e envios de formulários.

Para configuração rápida:

  1. Instale o SDK do .NET e pacotes necessários (PuppeteerSharp or Selenium.WebDriver).
  2. Use o PuppeteerSharp para automação específica do Chrome ou o Selenium para suporte entre navegadores.
  3. Escreva scripts em C# para interagir com páginas da web, extrair dados ou executar testes automatizados.

Ambas as ferramentas são poderosas. O PuppeteerSharp é ideal para tarefas centradas no Chrome, enquanto o Selenium se destaca em cenários entre navegadores. Escolha com base nas necessidades do seu projeto.

Teste de navegador sem cabeça Selenium em C# com PhantomJSGenericName

PhantomJSGenericName

Requisitos de configuração

Configurar um navegador headless em C# envolve ferramentas e configurações específicas. Aqui está uma análise do software necessário e uma comparação entre PuppeteerSharp e Selenium WebDriver.

Instalação de software necessária

Para começar, você precisará do seguinte:

Pacote Comando de instalação Propósito
Marionetista afiado dotnet add package PuppeteerSharp Automatiza e controla o Chrome/Chromium
Selenium WebDriverName dotnet add package Selenium.WebDriver --version 4.29.0 Habilita a automação de vários navegadores
Drivers do navegador Baixe os drivers necessários para o seu navegador Garante a funcionalidade do Selenium

Quando o software estiver pronto, vamos examinar como o PuppeteerSharp e o Selenium WebDriver se comparam.

Marionetista afiado vs Selenium WebDriverName

Marionetista afiado

Ambas as ferramentas são excelentes para automação de navegador headless, mas atendem a propósitos diferentes. Aqui está uma rápida comparação:

Característica Marionetista afiado Selenium WebDriverName
Suporte do navegador Limitado ao Chrome/Chromium Funciona com Chrome, Firefox, Edge, etc.
Complexidade de configuração Simples – inclui download automático do Chromium Requer instalação de driver separada
Desempenho Otimizado para Chrome/Chromium Consistente em todos os navegadores suportados
Design da API Moderno, baseado em promessas Tradicional, orientado a objetos
Uso da Memória Menor uso de memória Varia dependendo do navegador

Para desenvolvedores C#, o PuppeteerSharp é geralmente o mais rápido de configurar. Seu gerenciamento automático do Chromium e sua API amigável o tornam ideal para projetos focados somente no Chrome/Chromium. Por outro lado, o Selenium WebDriver é mais adequado para projetos que exigem compatibilidade entre navegadores, pois ele suporta múltiplos navegadores por meio de eventos de nível de SO e drivers dedicados.

Para baixar o Chromium para PuppeteerSharp, use o seguinte código:

await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);

Esta configuração fornece as ferramentas necessárias para uma automação robusta do navegador headless, esteja você trabalhando em estruturas de teste, web scraping ou automatizando fluxos de trabalho.

Introdução ao PuppeteerSharp

O PuppeteerSharp oferece uma API poderosa para controlar o Chrome ou o Chromium no modo headless, o que o torna uma escolha sólida para tarefas de automação web em C#.

Primeiro lançamento do navegador

Depois de instalar o PuppeteerSharp através do NuGet, você pode configurar e iniciar o navegador assim:

// Ensure Chromium is downloaded using BrowserFetcher
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);

// Launch the browser in headless mode
var launchOptions = new LaunchOptions {
    Headless = true,
    Args = new[] { "--no-sandbox", "--disable-setuid-sandbox" }
};

using var browser = await Puppeteer.LaunchAsync(launchOptions);
using var page = await browser.NewPageAsync();

// Navigate to a webpage
await page.GoToAsync("https://example.com");

Depois de iniciar o navegador, você pode começar a interagir com páginas da web e coletar dados.

Ações de página e coleta de dados

O PuppeteerSharp permite que você execute diversas ações em páginas da web e extraia informações:

// Enter text into an input field
await page.TypeAsync("#search-input", "search term");

// Click a button
await page.ClickAsync("#submit-button");

// Get text content from an element
var content = await page.EvaluateExpressionAsync<string>("document.querySelector('.content').textContent");

// Capture a screenshot
await page.ScreenshotAsync("page-capture.png");

Para melhor desempenho de raspagem, considere estas técnicas:

Técnica Como implementar de Saúde
Solicitar Interceptação Bloquear recursos desnecessários Reduz o tempo de carregamento
Cache de ativos Use um diretório de dados de usuário personalizado Acelera visitas repetidas
Limitação de taxa Adicione atrasos entre solicitações Reduz a sobrecarga do servidor

Trabalhando com conteúdo dinâmico

O conteúdo estático é simples, mas o conteúdo dinâmico geralmente requer etapas adicionais, como esperar que os elementos carreguem ou manipular dados renderizados por JavaScript:

// Wait for a specific element to appear
await page.WaitForSelectorAsync(".dynamic-content");

// Wait for navigation to complete with network idle
await page.WaitForNavigationAsync(new NavigationOptions {
    WaitUntil = new[] { WaitUntilNavigation.NetworkIdle0 }
});

// Extract text from dynamically loaded content
var dynamicContent = await page.EvaluateFunctionAsync<string>(@"() => {
    return document.querySelector('.js-content').innerText;
}");

Para interações mais complexas, como trabalhar com aplicativos como o Bing Maps, você pode encadear ações para manipular conteúdo avançado renderizado em JavaScript.

Não se esqueça de lidar com erros e definir tempos limite para evitar problemas inesperados:

try {
    await page.WaitForSelectorAsync(".dynamic-element", new WaitForSelectorOptions {
        Timeout = 5000
    });
} catch (WaitTaskTimeoutException) {
    Console.WriteLine("Element did not appear within 5 seconds");
}

Por fim, certifique-se de limpar os recursos corretamente:

await page.CloseAsync();
await browser.CloseAsync();

Essa abordagem mantém sua automação eficiente e evita vazamentos de memória.

sbb-itb-23997f1

Usando Selenium WebDriver

Selenium WebDriver é uma ferramenta poderosa para automação de navegador em C#. Diferentemente do PuppeteerSharp, que foca no Chrome, o Selenium suporta múltiplos navegadores, tornando-o uma escolha versátil para testes.

Configuração do modo sem cabeça

Para configurar o Selenium WebDriver para o modo headless, você precisa de configurações específicas do navegador. Veja como configurá-lo para Chrome, Firefox e Edge:

// Chrome setup
var chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--headless=new");
var chromeDriver = new ChromeDriver(chromeOptions);

// Firefox setup
var firefoxOptions = new FirefoxOptions();
firefoxOptions.Headless = true;
var firefoxDriver = new FirefoxDriver(firefoxOptions);

// Edge setup
var edgeOptions = new EdgeOptions();
edgeOptions.Headless = true;
var edgeDriver = new EdgeDriver(edgeOptions);

Executar navegadores no modo headless permite que você execute tarefas como interagir com elementos de página sem uma interface de usuário visível.

"Ao descontinuar o método de conveniência (e removê-lo no Selenium 4.10.0), os usuários terão controle total para escolher qual modo headless desejam usar." - Diego Molina, Selenium

Interações avançadas de página

O Selenium WebDriver lida com interações web detalhadas sem esforço. Aqui está um exemplo de como automatizar tarefas comuns:

// Initialize WebDriverWait for explicit waits
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

// Wait for an element to become visible and interact with it
var element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("dynamicElement")));
element.Click();

// Handle alerts
var alert = driver.SwitchTo().Alert();
alert.Accept();

// Work with frames
driver.SwitchTo().Frame("frameId");
var frameElement = driver.FindElement(By.CssSelector(".frame-content"));
driver.SwitchTo().DefaultContent();

Seletores de elementos comuns:

Tipo de seletor Melhor caso de uso Exemplo
ID Elementos únicos By.Id("login-button")
APF Padrões complexos By.CssSelector(".nav > .item")
XPath Conteúdo dinâmico By.XPath("//div[contains(@class, 'dynamic')]")

Opções de exportação de página

O Selenium fornece várias maneiras de capturar e exportar conteúdo de página. Aqui estão alguns exemplos:

// Take a full page screenshot
var screenshot = ((ITakesScreenshot)driver).GetScreenshotAs(ScreenshotImageFormat.Png);
screenshot.SaveAsFile("page.png");

// PDF export
var printOptions = new PrintOptions()
{
    Orientation = PrintOrientation.Portrait,
    Scale = 1.0
};
driver.SavePrintPage(printOptions).SaveAsFile("page.pdf");

// Get page source
var htmlContent = driver.PageSource;
File.WriteAllText("page.html", htmlContent);

As configurações de tempo são essenciais para uma automação suave:

// Custom wait condition for page load
wait.Until(driver => ((IJavaScriptExecutor)driver)
    .ExecuteScript("return document.readyState").Equals("complete"));

// Wait for a specific element to be present before exporting
wait.Until(ExpectedConditions.ElementExists(By.CssSelector(".content-loaded")));

Por fim, garanta a limpeza adequada dos recursos quando terminar:

driver.Quit();
driver.Dispose();

Solução de problemas e dicas

Gerenciamento de velocidade e memória

Navegadores headless, como os usados ​​no PuppeteerSharp, pulam o carregamento de CSS, tornando-os mais rápidos do que os navegadores tradicionais. Para aproveitar ao máximo essa velocidade e reduzir o uso de recursos, considere estas otimizações:

var launchOptions = new LaunchOptions
{
    Headless = true,
    Args = new[]
    {
        "--disable-gpu",
        "--disable-dev-shm-usage",
        "--disable-setuid-sandbox",
        "--no-sandbox",
        "--window-size=1920,1080"
    }
};

// Set a custom cache directory
launchOptions.UserDataDir = "C:\\BrowserCache";

Você também pode bloquear recursos desnecessários, como imagens ou folhas de estilo, para economizar memória:

await page.SetRequestInterceptionAsync(true);
page.Request += async (sender, e) =>
{
    if (e.Request.ResourceType == ResourceType.Document)
        await e.Request.ContinueAsync();
    else
        await e.Request.AbortAsync();
};

Guia de correção de erros

Melhorar o desempenho é ótimo, mas lidar com erros comuns é igualmente importante para uma automação suave. Aqui está um guia rápido:

Tipo de Erro Causa comum Solução
Exceções de tempo limite Carregamento lento da página Use WebDriverWait com tempos limite mais longos
Elemento não encontrado Conteúdo dinâmico Use esperas explícitas e seletores precisos
Incompatibilidade de versão do driver Componentes desatualizados Mantenha as versões do WebDriver e do navegador alinhadas

Por exemplo, você pode usar este código para lidar com páginas de carregamento lento:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(driver => ((IJavaScriptExecutor)driver)
    .ExecuteScript("return document.readyState").Equals("complete"));

"O modo sem cabeça às vezes pode se comportar de forma diferente devido a aspectos de renderização não serem visíveis." - ClimbingLion

Etapas de login e segurança

Uma vez que os erros são gerenciados, concentre-se na autenticação segura e confiável. Aqui está um exemplo de como lidar com credenciais de forma segura:

// Use environment variables for credentials
var username = Environment.GetEnvironmentVariable("AUTH_USERNAME");
var password = Environment.GetEnvironmentVariable("AUTH_PASSWORD");

// Apply rate limiting
private static readonly SemaphoreSlim _rateLimiter = new(1, 1);
await _rateLimiter.WaitAsync();
try
{
    await page.TypeAsync("#username", username);
    await page.TypeAsync("#password", password);
    await Task.Delay(1000); // Respect rate limits
}
finally
{
    _rateLimiter.Release();
}

Principais práticas de segurança a serem seguidas:

  • Use limitação de taxa baseada em IP para evitar abusos.
  • Armazene informações confidenciais, como credenciais, em variáveis ​​de ambiente.
  • Garanta o manuseio adequado da sessão.
  • Realize revisões de segurança regulares.

Para lidar com erros de autenticação, implemente uma lógica de repetição como esta:

try
{
    await page.WaitForSelectorAsync(".login-success", 
        new WaitForSelectorOptions { Timeout = 5000 });
}
catch (WaitTaskTimeoutException)
{
    // Log the failed attempt and retry
    await page.ReloadAsync();
}

Conclusão

Resumo

A automação do navegador sem interface em C# fornece opções poderosas com Marionetista afiado e Selenium WebDriverName. Enquanto o PuppeteerSharp é conhecido por sua velocidade e eficiência com Chrome/Chromium, o Selenium se destaca por sua compatibilidade entre navegadores e integrações de nível empresarial .

Aqui está uma análise rápida:

  • Marionetista afiado: Ideal para automação do Chrome/Chromium quando velocidade e eficiência de recursos são prioridades .
  • Selênio:Mais adequado para tarefas que exigem compatibilidade com vários navegadores e suporte a idiomas mais amplo .

"Puppeteer é a melhor escolha quando velocidade e controle de navegador refinado são essenciais. O Selenium suporta mais idiomas e é mais adequado se você precisa executar suas tarefas de scraping em vários navegadores." - ZenRows

Ao entender os pontos fortes dessas ferramentas, você pode selecionar a mais adequada para suas necessidades e projetos específicos.

Aprendizagem Adicional

Se você deseja expandir seu conhecimento sobre navegadores headless em C#, estes recursos podem ajudar:

  • Participe no #marionetista-afiado Canal do Slack para assistência em tempo real .
  • Confira o PuppeteerSharp.Contrib biblioteca para recursos adicionais .
  • Mergulhe no documentação oficial da API para se familiarizar com toda a gama de recursos .

As aplicações práticas dessas ferramentas incluem:

  • Testes em pipelines de CI/CD.
  • Extração de conteúdo dinâmico da web.
  • Monitoramento do desempenho do site.
  • Executando testes de interface do usuário em diferentes navegadores.

O cenário do navegador headless está sempre avançando. Mantenha-se atualizado interagindo com projetos do GitHub e fóruns de desenvolvedores para aproveitar ao máximo as novas atualizações e as melhores práticas emergentes.

Artigos Relacionados

Trocar aplicativos

Aplicativo 1

Aplicativo 2

- Escolha um gatilho

- Escolha uma ação

Quando isso acontece...

Nome do nó

ação, por exemplo, excluir

Nome do nó

ação, por exemplo, excluir

Nome do nó

ação, por exemplo, excluir

Nome do nó

descrição do gatilho

Nome do nó

ação, por exemplo, excluir

Obrigado! Sua submissão foi recebida!
Opa! Ocorreu um erro ao enviar o formulário.

Faça isso.

Nome do nó

ação, por exemplo, excluir

Nome do nó

ação, por exemplo, excluir

Nome do nó

ação, por exemplo, excluir

Nome do nó

descrição do gatilho

Nome do nó

ação, por exemplo, excluir

Obrigado! Sua submissão foi recebida!
Opa! Ocorreu um erro ao enviar o formulário.
Experimente agora

Sem necessidade de cartão de crédito

Sem restrição

Jorge Miloradovitch
Pesquisador, redator e entrevistador de casos de uso
3 de março de 2025
.
8
min ler

Blogs relacionados

Caso de uso

Apoiado por