Una plataforma de código bajo que combina la simplicidad sin código con el poder del código completo 🚀
Empieza ahora gratis
Marzo 3, 2025
8
min leer

Navegador sin interfaz gráfica en C#: configuración y ejemplos de código

George Miloradovich
Investigador, redactor y entrevistador de casos prácticos
Tabla de contenidos.

Los navegadores sin interfaz gráfica permiten automatizar tareas web sin una interfaz gráfica. En C#, se utilizan ampliamente para realizar pruebas, extraer datos de la web y administrar contenido. Dos herramientas populares son TitiriteroAfilado (optimizado para Chrome/Chromium) y Selenio WebDriver (compatible con varios navegadores). A continuación, se muestra una comparación:

Feature TitiriteroAfilado Selenio WebDriver
Soporte del navegador Cromo / cromo Chrome, Firefox, Edge, etc.
Complejidad de configuración Fácil (descarga automática de Chromium) Requiere configuración de controlador independiente
Performance Más rápido para Chrome/Chromium Coherente en todos los navegadores
Diseño API Moderno, basado en promesas Tradicional, orientado a objetos
Uso de la memoria Más Bajo Varía según el navegador

Principales ventajas de los navegadores sin interfaz gráfica:

  • Velocidad: Pruebas más rápidas sin renderizado de GUI.
  • Eficiencia: Utiliza menos memoria y CPU.
  • Automatización: Maneja tareas como extracción de datos, pruebas y envío de formularios.

Para una configuración rápida:

  1. Instale la SDK de .NET y los paquetes requeridos (PuppeteerSharp or Selenium.WebDriver).
  2. Utilice PuppeteerSharp para la automatización específica de Chrome o Selenium para compatibilidad con varios navegadores.
  3. Escriba scripts en C# para interactuar con páginas web, extraer datos o realizar pruebas automatizadas.

Ambas herramientas son potentes. PuppeteerSharp es ideal para tareas centradas en Chrome, mientras que Selenium se destaca en escenarios multiplataforma. Elija según las necesidades de su proyecto.

Pruebas del navegador sin interfaz gráfica de Selenium en C# con PhantomJS

PhantomJS

Requisitos de instalación

Para configurar un navegador sin interfaz gráfica en C# se necesitan herramientas y configuraciones específicas. A continuación, se detalla el software necesario y se compara PuppeteerSharp y Selenium WebDriver.

Instalación de software requerida

Para comenzar, necesitará lo siguiente:

PREMIUM Comando de instalación Propósito
TitiriteroAfilado dotnet add package PuppeteerSharp Automatiza y controla Chrome/Chromium
Selenio WebDriver dotnet add package Selenium.WebDriver --version 4.29.0 Permite la automatización de múltiples navegadores
Controladores del navegador Descargue los controladores necesarios para su navegador Garantiza la funcionalidad de Selenium

Una vez que el software esté listo, examinemos cómo se comparan PuppeteerSharp y Selenium WebDriver.

TitiriteroAfilado vs Selenio WebDriver

TitiriteroAfilado

Ambas herramientas son excelentes para la automatización de navegadores sin interfaz gráfica, pero tienen diferentes propósitos. A continuación, se muestra una comparación rápida:

Feature TitiriteroAfilado Selenio WebDriver
Soporte del navegador Limitado a Chrome/Chromium Funciona con Chrome, Firefox, Edge, etc.
Complejidad de configuración Sencillo: incluye descarga automática de Chromium Requiere instalación de controlador independiente
Performance Optimizado para Chrome/Chromium Coherente entre los navegadores compatibles
Diseño API Moderno, basado en promesas Tradicional, orientado a objetos
Uso de la memoria Menor uso de memoria Varía según el navegador.

Para los desarrolladores de C#, PuppeteerSharp suele ser el más rápido de configurar. Su gestión automática de Chromium y su API fácil de usar lo hacen ideal para proyectos centrados únicamente en Chrome/Chromium. Por otro lado, Selenium WebDriver es más adecuado para proyectos que requieren compatibilidad entre navegadores, ya que admite varios navegadores a través de eventos a nivel de SO y controladores dedicados.

Para descargar Chromium para PuppeteerSharp, utilice el siguiente código:

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

Esta configuración le proporciona las herramientas que necesita para una automatización robusta del navegador sin cabeza, ya sea que esté trabajando en marcos de prueba, raspado web o automatizando flujos de trabajo.

Introducción a PuppeteerSharp

PuppeteerSharp ofrece una potente API para controlar Chrome o Chromium en modo headless, lo que lo convierte en una opción sólida para tareas de automatización web de C#.

Primer lanzamiento del navegador

Una vez que haya instalado PuppeteerSharp a través de NuGet, puede configurar e iniciar el navegador de esta manera:

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

Después de iniciar el navegador, puede comenzar a interactuar con páginas web y recopilar datos.

Acciones de página y recopilación de datos

PuppeteerSharp le permite realizar diversas acciones en páginas web y extraer información:

// 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 un mejor rendimiento de raspado, considere estas técnicas:

Tecnologia Cómo implementar Beneficios
Solicitud de intercepción Bloquear recursos innecesarios Reduce el tiempo de carga
Almacenamiento en caché de activos Utilice un directorio de datos de usuario personalizado Acelera las visitas repetidas
Limitación de la velocidad Agregar retrasos entre solicitudes Reduce la tensión del servidor

Trabajar con contenido dinámico

El contenido estático es sencillo, pero el contenido dinámico a menudo requiere pasos adicionales, como esperar a que se carguen los elementos o manejar datos renderizados en 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 interacciones más complejas, como trabajar con aplicaciones como Bing Maps, puedes encadenar acciones para manejar contenido avanzado renderizado en JavaScript.

No olvides gestionar los errores y establecer tiempos de espera 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 último, asegúrese de limpiar los recursos adecuadamente:

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

Este enfoque mantiene la eficiencia de su automatización y evita pérdidas de memoria.

sbb-itb-23997f1

Uso de Selenium WebDriver

Selenium WebDriver es una herramienta potente para la automatización de navegadores en C#. A diferencia de PuppeteerSharp, que se centra en Chrome, Selenium es compatible con varios navegadores, lo que lo convierte en una opción versátil para realizar pruebas.

Configuración del modo sin cabeza

Para configurar Selenium WebDriver en modo sin interfaz gráfica, necesitas configuraciones específicas del navegador. Aquí te mostramos cómo configurarlo para Chrome, Firefox y 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);

Ejecutar navegadores en modo sin cabeza le permite realizar tareas como interactuar con elementos de la página sin una interfaz de usuario visible.

"Al descontinuar el método de conveniencia (y eliminarlo en Selenium 4.10.0), los usuarios tendrán el control total para elegir qué modo sin interfaz gráfica desean usar". - Diego Molina, Selenium

Interacciones de página avanzadas

Selenium WebDriver gestiona interacciones web detalladas sin esfuerzo. A continuación, se muestra un ejemplo de cómo automatizar tareas comunes:

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

Selectores de elementos comunes:

Tipo de selector Mejor caso de uso Ejemplo
ID Elementos únicos By.Id("login-button")
CO Patrones complejos By.CssSelector(".nav > .item")
XPath Contenido dinámico By.XPath("//div[contains(@class, 'dynamic')]")

Opciones de exportación de página

Selenium ofrece varias formas de capturar y exportar contenido de páginas. A continuación, se muestran algunos ejemplos:

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

Las configuraciones de tiempo son esenciales para una automatización fluida:

// 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 último, asegúrate de limpiar adecuadamente los recursos cuando hayas terminado:

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

Solución de problemas y sugerencias

Gestión de velocidad y memoria

Los navegadores sin interfaz gráfica, como los que se utilizan en PuppeteerSharp, omiten la carga de CSS, lo que los hace más rápidos que los navegadores tradicionales. Para aprovechar al máximo esta velocidad y reducir el uso de recursos, considere estas optimizaciones:

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

También puedes bloquear recursos innecesarios como imágenes u hojas de estilo para ahorrar memoria:

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

Guía de corrección de errores

Mejorar el rendimiento es genial, pero solucionar errores comunes es igual de importante para lograr una automatización fluida. A continuación, se incluye una guía rápida:

Tipo de error Causa comun Solución
Excepciones de tiempo de espera Carga de página lenta Usos WebDriverWait con tiempos de espera más largos
Elemento no encontrado Contenido dinámico Utilice esperas explícitas y selectores precisos
La versión del controlador no coincide Componentes obsoletos Mantenga alineadas las versiones de WebDriver y del navegador

Por ejemplo, puedes usar este código para gestionar páginas de carga lenta:

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

"El modo sin cabeza a veces puede comportarse de manera diferente debido a que los aspectos de renderizado no son visibles". - ClimbingLion

Pasos de inicio de sesión y seguridad

Una vez que se hayan gestionado los errores, hay que centrarse en una autenticación segura y fiable. A continuación, se muestra un ejemplo de cómo gestionar las credenciales 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();
}

Prácticas de seguridad clave a seguir:

  • Utilice la limitación de velocidad basada en IP para evitar abusos.
  • Almacene información confidencial, como credenciales, en variables de entorno.
  • Asegúrese de que la sesión se gestione correctamente.
  • Realizar revisiones de seguridad periódicas.

Para gestionar errores de autenticación, implemente una lógica de reintento como la siguiente:

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

Conclusión

Resum

La automatización del navegador sin interfaz gráfica en C# proporciona opciones potentes con TitiriteroAfilado y Selenio WebDriverSi bien PuppeteerSharp es conocido por su velocidad y eficiencia con Chrome/Chromium, Selenium se destaca por su compatibilidad entre navegadores e integraciones a nivel empresarial.

Aquí hay un desglose rápido:

  • TitiriteroAfilado:Ideal para la automatización de Chrome/Chromium cuando la velocidad y la eficiencia de los recursos son prioridades.
  • Selenio:Ideal para tareas que requieren compatibilidad con múltiples navegadores y un soporte de idiomas más amplio.

"Puppeteer es la mejor opción cuando la velocidad y el control detallado del navegador son esenciales. Selenium admite más idiomas y es más adecuado si necesita ejecutar sus tareas de extracción de datos en varios navegadores". - ZenRows

Al comprender las fortalezas de estas herramientas, podrá seleccionar la adecuada para sus necesidades y proyectos específicos.

Aprendizaje adicional

Si desea ampliar su conocimiento sobre los navegadores sin interfaz gráfica en C#, estos recursos pueden ayudarlo:

  • Únete a los #titiritero-afilado Canal de Slack para asistencia en tiempo real.
  • Primero eche un vistazo al sitio web de la página PuppeteerSharp.Contribución Biblioteca para funciones adicionales.
  • Lee el documentación oficial de la API Para familiarizarse con la gama completa de capacidades.

Las aplicaciones prácticas de estas herramientas incluyen:

  • Pruebas en pipelines de CI/CD.
  • Extrayendo contenido web dinámico.
  • Monitoreo del rendimiento del sitio web.
  • Realizar pruebas de UI en diferentes navegadores.

El panorama de los navegadores sin interfaz gráfica está en constante avance. Manténgase actualizado participando en proyectos de GitHub y foros de desarrolladores para aprovechar al máximo las nuevas actualizaciones y las mejores prácticas emergentes.

Blog y artículos

Blogs relacionados

Caso de uso

Respaldado por