Para crear un agente con Browser Use en Python, pasa a Agent un modelo, un Browser nuevo y una tarea con respuesta comprobable. Aquí el agente lee un encabezado y un código en un HTML local. Pydantic valida la estructura y el programa compara los dos valores con los de la página.
Un reporte sobre la validación de acciones muestra un fallo en una versión anterior, cuando el modelo generó acciones que la biblioteca rechazó. El ejemplo sigue la guía de inicio y la documentación del formato de salida. Se revisó con esas fuentes y queda pendiente su ejecución de extremo a extremo.
Puntos clave
Usa la biblioteca de Browser Use para Python cuando tu aplicación deba controlar la sesión, la tarea y las comprobaciones.
Empieza con un HTML local y una sesión sin cuentas iniciadas.
Puedes elegir por separado dónde ejecutar el navegador y el modelo.
ChatBrowserUsellama a un modelo alojado aunque Chromium sea local.history.is_successful()devuelve la valoración del agente. Comprueba los valores por tu cuenta.Para la primera prueba, usa una página sin formulario, cuentas ni carga de archivos.
Dónde se ejecutan el navegador y el modelo
El modelo elige las acciones y el navegador las ejecuta. Python conecta ambos. Esta diferencia ayuda a decidir entre un agente de navegador, pasos fijos en Playwright y una búsqueda web.
| Configuración | Dónde se ejecuta el navegador | Cuándo elegirla |
|---|---|---|
| Biblioteca Python y navegador local | En la máquina del script | Quieres leer una página local y validar la respuesta en Python |
| Biblioteca Python y navegador remoto | En una sesión accesible al script | Necesitas infraestructura remota y la página es accesible desde allí |
| Agente alojado en Browser Use Cloud | En infraestructura gestionada | Quieres usar la API del agente alojado y tienes un destino accesible |
Este ejemplo toma la primera opción. Guarda BROWSER_USE_API_KEY en el entorno o en un archivo .env local, según la guía de inicio. Evita subir la clave al repositorio. Con uv instalado, ejecuta estos comandos en un directorio de proyecto nuevo.
uv init --python 3.12
uv add browser-use
uvx browser-use installEl último comando prepara Chromium. Guarda el archivo de bloqueo para repetir la instalación. La lista de modelos compatibles incluye ChatOllama. Si cambias de proveedor, conserva la página y los valores esperados. Comprueba tanto las acciones como la respuesta final. La guía de Cloud tiene su propia configuración de acceso y sesión.
Una consulta de QA en Reddit busca un modelo autoalojado para mantener los datos de clientes en su infraestructura. Con ese requisito, elige un modelo local. Este ejemplo solo envía datos ficticios.
Crea una página con una respuesta conocida
Guarda el HTML en fixture/index.html. El código es ficticio y la página carece de formularios y credenciales. Deja el servidor en otra terminal. Solo servirá el directorio fixture.
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<title>Inventory fixture</title>
<main>
<h1>Inventory Check</h1>
<p>Reference code: BU-741</p>
</main>
</html>uv run python -m http.server 8765 --bind 127.0.0.1 --directory fixture127.0.0.1 corresponde al equipo del navegador. Una sesión remota intentará abrir su propia dirección local. En este ejercicio, mantén el navegador y el servidor en el mismo equipo. Puedes abrir la página a mano para comprobar el acceso.
Ejecuta el agente y valida ambos campos
Guarda check_page.py en la raíz del proyecto. Consulta los parámetros del navegador para limitar dominios y los parámetros de Agent para definir el esquema. La tarea recibe la URL. Los valores de referencia quedan en la comprobación para que el agente tenga que leerlos en la página.
import asyncio
from tempfile import TemporaryDirectory
from browser_use import Agent, Browser, ChatBrowserUse
from pydantic import BaseModel
URL = "http://127.0.0.1:8765/"
class PageCheck(BaseModel):
heading: str
reference: str
async def main():
with TemporaryDirectory(prefix="browser-use-fixture-") as profile:
browser = Browser(
headless=True,
user_data_dir=profile,
allowed_domains=["127.0.0.1"],
accept_downloads=False,
)
try:
agent = Agent(
task=(
f"Open {URL} and read its visible heading and reference code. "
"Return only those two values. Do not interact with any form."
),
browser=browser,
llm=ChatBrowserUse(),
output_model_schema=PageCheck,
)
history = await agent.run(max_steps=5)
result = history.structured_output
expected = PageCheck(heading="Inventory Check", reference="BU-741")
if result != expected:
raise RuntimeError("The output does not match the fixture.")
print(result.model_dump_json())
finally:
await browser.stop()
if __name__ == "__main__":
asyncio.run(main())uv run python check_page.pySi el script imprime el resultado esperado, verás Inventory Check y BU-741. Si detecta una discrepancia, revisa el historial antes de ampliar el límite de pasos. Más pasos pueden repetir el mismo error.
Comprueba por separado la visita, la salida y los efectos

Busca una petición a / en el registro del servidor durante la ejecución. Después revisa history.urls(), history.errors() y la salida de la terminal. El formato de salida distingue entre terminar, declarar éxito y comprobar el resultado de forma independiente.
Mantén la sesión separada de tu perfil habitual. Conectar un navegador existente cambia las sesiones y cookies a las que el agente tiene acceso. La lista de dominios limita la navegación. En una aplicación real, usa una cuenta de prueba y aplica los permisos de lectura en el servidor. Consulta los riesgos de seguridad de los agentes.
Localiza la primera etapa que falla
| Síntoma | Qué revisar primero | Siguiente comprobación |
|---|---|---|
| El navegador arranca y el servidor no recibe peticiones | Equipo, dirección local, puerto y dominios permitidos | Abre la página desde el equipo que ejecuta Chromium |
| El proveedor rechaza la petición | Clave, endpoint, adaptador y acceso al modelo | Lee el error del proveedor antes de cambiar el navegador |
| El historial registra acciones inválidas | Adaptador del modelo y versión de Browser Use | Repite la prueba con un adaptador documentado |
| El objeto es válido pero difiere un valor | Contenido que vio el navegador y texto copiado | Compara los campos con el HTML y el registro |
Un reporte sobre CDP remoto describe llamadas al protocolo del navegador que se quedaban bloqueadas. Es una etapa distinta de la validación de acciones. Ambos reportes corresponden a versiones concretas. Guíate por el error de tu ejecución.
Si la tarea puede crear registros o enviar mensajes, comprueba su estado en el sistema de destino antes de reintentar tras un timeout. Para esta página de lectura, puedes repetir la visita y revisar el registro.
Cuándo mantener la integración en Python
Usa Python si otra parte de la aplicación necesita consumir y verificar campos tipados. Con URL, selectores y pasos fijos, basta un script de navegador. Para una inspección puntual, abre la página y compara el texto. La comparativa de Tabbit y Browser Use y la guía de navegadores con agentes explican en qué se distingue la interfaz de navegador de una integración en código.
En la primera ejecución, comprueba que el servidor recibió la petición y que coinciden los dos valores. Para probar otro navegador, proveedor o sitio, cambia una sola pieza cada vez.
Preguntas frecuentes
¿Hace falta una clave de Browser Use para usar la biblioteca de Python?
ChatBrowserUse sí requiere una clave de Browser Use. Cada adaptador tiene su propia configuración y Ollama puede funcionar localmente sin esa clave.
¿Puedo usar un modelo local de Ollama?
Sí, la documentación incluye ChatOllama. Comprueba que el modelo elegido genere tanto las acciones del navegador como la salida en el formato solicitado.
¿Cómo hago que la primera tarea sea de solo lectura?
Usa una página de prueba sin cuentas ni endpoints de escritura. Si pasas a un sistema real, aplica los permisos de lectura en el servidor.
¿Por qué el navegador remoto no llega a localhost?
La dirección apunta al equipo remoto que ejecuta el navegador. Para este ejercicio, ejecuta ambos procesos en la misma máquina o habilita un destino de pruebas accesible desde allí.
¿Qué significa history.is_successful()?
Es el resultado que declara el agente. Comprueba el destino y los valores por separado antes de dar la tarea por completada.
¿Qué reviso si structured_output está vacío?
Lee los errores de navegación, del proveedor y de acciones en el historial. Comprueba que la tarea terminó con output_model_schema configurado antes de cambiar el esquema o el límite.