Selenium Modo de navegador sin cabeza
El modo de navegador sin cabeza (Headless Mode) se refiere a ejecutar el navegador sin una interfaz gráfica de usuario (GUI), en otras palabras, el navegador se ejecuta en segundo plano sin mostrar ventanas visibles.
El modo de navegador sin cabeza se utiliza comúnmente en escenarios como pruebas de automatización, web scraping y pruebas de rendimiento, porque permite ahorrar recursos del sistema y también puede ejecutarse normalmente en servidores sin monitor.
Habilitar el modo sin cabeza: mediante
ChromeOptionsoFirefoxOptionsagregar--headlessel parámetro.Configuración optimizada: deshabilitar la aceleración GPU, configurar el tamaño de la ventana, etc.
Verificar el modo sin cabeza: verificar el resultado de la ejecución del script imprimiendo el título de la página o tomando una captura de pantalla.
¿Por qué usar el modo de navegador sin cabeza?
- Ahorro de recursos: el modo sin cabeza no necesita renderizar la interfaz gráfica, por lo que ahorra recursos de CPU y memoria.
- Mayor velocidad: dado que no es necesario cargar y renderizar la interfaz gráfica, el modo sin cabeza suele ser más rápido que el modo normal.
- Adecuado para automatización: en pruebas automatizadas y web scraping, el modo sin cabeza evita distracciones y puede ejecutarse en servidores sin monitor.
- Facilita la depuración: en algunos casos, el modo sin cabeza puede ayudar a los desarrolladores a depurar y localizar problemas más rápidamente.
Modo de navegador sin cabeza en Selenium
Configurar el modo sin cabeza de Chrome
En Selenium, puedes usar la claseChromeOptionspara configurar el modo sin cabeza del navegador Chrome. A continuación se muestra un ejemplo sencillo:
Ejemplo
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
# Configurar el modo sin cabeza de Chrome
chrome_options = Options()
chrome_options.add_argument("--headless") # Habilitar el modo sin cabeza
chrome_options.add_argument("--disable-gpu") # Deshabilitar la aceleración GPU
# Crear la instancia de WebDriver
driver = webdriver.Chrome(service=Service('/path/to/chromedriver'), options=chrome_options)
# Abrir la página web
driver.get("https://www.baidu.com")
# Imprimir el título de la página web
print(driver.title)
# Cerrar el navegador
driver.quit()
Configurar el modo sin cabeza de Firefox
Para el navegador Firefox, puedes usar la claseFirefoxOptionspara configurar el modo sin cabeza. A continuación se muestra un ejemplo:
Ejemplo
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
# Configurar el modo sin cabeza de Firefox
firefox_options = Options()
firefox_options.add_argument("--headless") # Habilitar el modo sin cabeza
# Crear la instancia de WebDriver
driver = webdriver.Firefox(service=Service('/path/to/geckodriver'), options=firefox_options)
# Abrir la página web
driver.get("https://www.example.com")
# Imprimir el título de la página web
print(driver.title)
# Cerrar el navegador
driver.quit()
Configurar el modo sin cabeza de Edge
Para el navegador Edge, puedes usar la claseEdgeOptionspara configurar el modo sin cabeza. A continuación se muestra un ejemplo:
Ejemplo
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
# Configurar el modo sin cabeza de Edge
edge_options = Options()
edge_options.add_argument("--headless") # Habilitar el modo sin cabeza
# Crear la instancia de WebDriver
driver = webdriver.Edge(service=Service('/path/to/msedgedriver'), options=edge_options)
# Abrir la página web
driver.get("https://www.example.com")
# Imprimir el título de la página web
print(driver.title)
# Cerrar el navegador
driver.quit()
Problemas comunes y soluciones en el modo sin cabeza
Carga incompleta de la página
En el modo sin cabeza, a veces la página puede cargarse de forma incompleta, lo que impide encontrar los elementos. Se puede resolver de las siguientes maneras:
- Aumentar el tiempo de espera: usar
WebDriverWaitespera explícita para que el elemento termine de cargarse. - Ajustar el tamaño de la ventana: a veces la posición y el tamaño de los elementos de la página cambian según el tamaño de la ventana; se puede
driver.set_window_size(width, height)ajustar el tamaño de la ventana.
Capturas de pantalla y registros
En el modo sin cabeza, es posible que necesites tomar capturas de pantalla o registrar logs para depurar problemas. Puedes utilizar los siguientes métodos:
- Captura de pantalla: usar
driver.save_screenshot('screenshot.png')guardar la captura de pantalla de la página actual. - Registro (log): mediante
driver.get_log('browser')obtener los registros del navegador.
El modo de navegador sin cabeza es una herramienta potente en las pruebas automatizadas y el web scraping con Selenium. Con una configuración sencilla, puedes ejecutar el navegador sin interfaz gráfica, ahorrando recursos y mejorando la eficiencia. Tanto Chrome, Firefox como Edge, Selenium 4 ofrece métodos sencillos para habilitar el modo sin cabeza.
A continuación se muestra un ejemplo de código completo sobre cómo usar Selenium en modo sin cabeza para capturar la página principal de Baidu (www.baidu.com).
En el código se habilita el modo sin cabeza del navegador Chrome y se toma una captura de pantalla de la página que se guarda como archivo.
Ejemplo
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# Configurar las opciones de Chrome
chrome_options = Options()
chrome_options.add_argument("--headless") # Habilitar el modo sin cabeza
chrome_options.add_argument("--disable-gpu") # Deshabilitar la aceleración GPU
chrome_options.add_argument("--window-size=1920,1080") # Configurar el tamaño de la ventana
# Establecer la ruta correcta del controlador (driver)
service = ChromeService(executable_path="./chromedriver-mac-arm64/chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
# Abrir la página principal de Baidu
driver.get("https://www.baidu.com")
# Esperar a que la página termine de cargarse
time.sleep(2) # Puedes ajustar el tiempo de espera según sea necesario
# Forzar la detención de la carga de la página
driver.execute_script("window.stop();")
# Imprimir el título de la página
print("Título de la página:", driver.title)
# Tomar una captura de pantalla de la página y guardarla
screenshot_path = "baidu_screenshot.png"
driver.save_screenshot(screenshot_path)
print(f"Captura de pantalla guardada en: {screenshot_path}")
finally:
# Cerrar el navegador
driver.quit()
Después de una ejecución exitosa, se mostrará:
页面标题: 百度一下,你就知道 截图已保存到: baidu_screenshot.png
Al abrir el directorio actual verás el archivo baidu_screenshot.png, que se ve así:
