Um framework robusto e configurável para automação de navegadores, com gestão de perfis, sessões e uma CLI.
Project description
Browser-Core
Browser-Core é uma plataforma completa para orquestração de navegadores. O projeto nasceu para simplificar automações em larga escala, garantindo isolamento total dos ambientes e reprodutibilidade dos estados de cada sessão.
Neste documento você encontrará uma visão detalhada de como funciona o framework, dicas de utilização e todos os recursos disponíveis.
Sumário
- Introdução
- Instalação
- Conceitos Fundamentais
- Fluxo de Trabalho
- Exemplos de Uso
- Comandos da CLI
- Dicas Avançadas
- Contribuindo
- Licença
Introdução
Automatizar tarefas de navegador exige controle refinado sobre perfis, versões de drivers e paralelismo. Browser-Core abstrai essa complexidade oferecendo:
- Camadas de snapshots reutilizáveis para capturar o estado exato do navegador (cookies, localStorage, extensões, etc.).
- Workers isolados que partem desses snapshots e executam tarefas independentes em paralelo.
- Integração transparente com Selenium e Playwright, bastando escolher o motor desejado.
- Uma CLI poderosa para manipular snapshots e gerenciar o armazenamento local.
Com esses componentes é possível escalar automações para centenas de execuções mantendo total rastreabilidade.
Instalação
A instalação mais simples é via PyPI:
pip install browser-core
Isso disponibiliza a biblioteca para uso em scripts Python e também instala a ferramenta de linha de comando
browser-core.
Conceitos Fundamentais
Snapshots em Camadas : Permitem criar "imagens" do navegador e derivar novos estados a partir delas. Assim você registra um login ou configuração apenas uma vez e reutiliza em milhares de execuções.
Workers Isolados : Cada worker é iniciado a partir de um snapshot específico e executa a tarefa em um perfil totalmente separado dos demais.
Drivers Gerenciados : O projeto baixa e armazena a versão exata do WebDriver para o navegador escolhido, evitando incompatibilidades em diferentes máquinas.
Arquitetura Multi‑engine : Tanto Selenium quanto Playwright podem ser utilizados com a mesma API de alto nível.
CLI Integrada : Inclui comandos para criar snapshots base, listar estados existentes, inspecionar metadados e limpar todos os artefatos.
Fluxo de Trabalho
O uso típico divide-se em duas fases: criação dos snapshots e execução das tarefas.
1. Preparar os Snapshots
-
Criar o Snapshot Base – Perfil limpo com a versão de navegador desejada:
browser-core snapshots create-base chrome-base
-
Derivar um Snapshot com Estado – Por exemplo, realizar login em um site e salvar esse estado:
# scripts/create_login_snapshot.py import os from browser_core import Orchestrator, Worker, create_selector from browser_core.types import SelectorType APP_USER = os.getenv("APP_USER") APP_PASSWORD = os.getenv("APP_PASSWORD") def perform_login(worker: Worker): """Função que executa a lógica de login.""" worker.navigate_to("https://app.exemplo.com/login") worker.get(create_selector("input[name='email']", SelectorType.CSS)).send_keys(APP_USER) worker.get(create_selector("input[name='password']", SelectorType.CSS)).send_keys(APP_PASSWORD) worker.get(create_selector("button[type='submit']", SelectorType.CSS)).click() worker.get(create_selector("#dashboard", SelectorType.CSS)) # Aguarda o carregamento def main(): """Função principal para orquestrar a criação do snapshot.""" Orchestrator().create_snapshot_from_task( base_snapshot_id="chrome-base", new_snapshot_id="app_logged_in", setup_function=perform_login, metadata={"description": "Sessão autenticada"} ) print("Snapshot 'app_logged_in' criado com sucesso!") if __name__ == "__main__": main()
2. Executar Tarefas em Paralelo
Com o snapshot app_logged_in pronto, processe uma série de itens utilizando vários workers:
# scripts/run_tasks.py
from browser_core import Orchestrator, Worker, create_selector, default_settings
from browser_core.types import SelectorType
def fetch_report(worker: Worker, report_id: str):
"""Função que cada worker executará para buscar um relatório."""
worker.navigate_to(f"https://app.exemplo.com/reports/{report_id}")
table = worker.get(create_selector("#report-data-table", SelectorType.CSS)).text
return {"report_id": report_id, "length": len(table)}
def main():
"""Função principal para executar as tarefas em paralelo."""
REPORTS = ["Q1-2024", "Q2-2024", "Q3-2024", "Q4-2024"]
settings = default_settings()
settings["browser"]["headless"] = True
results = Orchestrator(settings).run_tasks_in_squad(
squad_size=2,
base_snapshot_id="app_logged_in",
task_items=REPORTS,
worker_setup_function=lambda w: True, # Função de setup simples
item_processing_function=fetch_report,
)
print(results)
if __name__ == "__main__":
main()
Exemplos de Uso
O exemplo acima demonstra a execução de tarefas em paralelo utilizando snapshots para reaproveitar o estado de login.
Comandos da CLI
A ferramenta browser-core auxilia na criação e manutenção dos snapshots e do armazenamento:
-
Criar snapshot base
browser-core snapshots create-base <snapshot-id>
-
Listar snapshots existentes
browser-core snapshots list
-
Inspecionar um snapshot
browser-core snapshots inspect <snapshot-id>
-
Criar snapshot a partir de uma tarefa
browser-core snapshots create-from-task --base <id-base> --new <id-novo> \ --setup-script path/setup.py --setup-function func
-
Depurar um snapshot
browser-core snapshots debug <snapshot-id>
-
Executar tarefas em esquadrão
browser-core run --snapshot <id> --tasks-file dados.csv \ --worker-script worker.py --worker-function processa
-
Limpar armazenamento
browser-core storage clean --force
Todas as opções estão disponíveis com browser-core --help.
Dicas Avançadas
- Modo headless ou gráfico: Defina
settings["browser"]["headless"]para alternar entre execução invisível ou com janela aberta. - Uso de proxies e variáveis de ambiente: É possível configurar proxies ou outras opções de driver diretamente nas
definições de
Settings. - Persistência de logs: Cada execução cria uma pasta com registros detalhados em
tasks_logs_dir, auxiliando depuração e auditoria. - API de Elementos mais rica:
ElementProxyagora possui métodos comohover(),scroll_to_view()e utilidades de espera (wait_for_visible,wait_for_clickable). Também é possível obter múltiplos elementos comworker.get_all()e coletar seus textos comget_texts(). - Pré-aquecimento do WebDriver: O Orchestrator garante que o driver necessário seja baixado uma única vez antes de iniciar os workers, evitando conflitos em execuções paralelas.
- Extensibilidade: A estrutura de
WorkereOrchestratorpermite implementar tarefas complexas com facilidade, reutilizando funções comuns de manipulação de página.
Contribuindo
Contribuições são bem-vindas! Para configurar o ambiente de desenvolvimento:
-
Clone o repositório:
git clone https://github.com/gabrielbarbosel/browser-core.git cd browser-core
-
Crie um ambiente virtual:
python -m venv .venv source .venv/bin/activate
-
Instale as dependências de desenvolvimento:
pip install -e ".[dev]"
-
Execute as verificações locais:
black -q src pytest -q
Licença
Distribuído sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file browser_core-2.7.0.tar.gz.
File metadata
- Download URL: browser_core-2.7.0.tar.gz
- Upload date:
- Size: 52.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24f0d6c98498fb4539c3b05c2b173d0cadbb00d324e148ddaaa5925e0dc1cebc
|
|
| MD5 |
2c625bc3a75d99c7ace3460b325ed251
|
|
| BLAKE2b-256 |
f5a51f7705a5da25b9ae8282cc8a387f41a34e2d6ab59833a24f13254360a7db
|
Provenance
The following attestation bundles were made for browser_core-2.7.0.tar.gz:
Publisher:
release-and-publish.yml on gabrielbarbosel/browser-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
browser_core-2.7.0.tar.gz -
Subject digest:
24f0d6c98498fb4539c3b05c2b173d0cadbb00d324e148ddaaa5925e0dc1cebc - Sigstore transparency entry: 519599787
- Sigstore integration time:
-
Permalink:
gabrielbarbosel/browser-core@3984272c8da89922a0848143cc4fa5f075fb2927 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/gabrielbarbosel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-and-publish.yml@3984272c8da89922a0848143cc4fa5f075fb2927 -
Trigger Event:
push
-
Statement type:
File details
Details for the file browser_core-2.7.0-py3-none-any.whl.
File metadata
- Download URL: browser_core-2.7.0-py3-none-any.whl
- Upload date:
- Size: 61.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
33c95c8e7d83bf96093ecceb6ee32b3d8461ea351d8a371d8c7b8089647041e7
|
|
| MD5 |
e118ff398621025316e0e8483d9cc80b
|
|
| BLAKE2b-256 |
780c9378b024d2e6eb0b52ba95a13c913659f1e82c26f48473b21ff0e7f4f42e
|
Provenance
The following attestation bundles were made for browser_core-2.7.0-py3-none-any.whl:
Publisher:
release-and-publish.yml on gabrielbarbosel/browser-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
browser_core-2.7.0-py3-none-any.whl -
Subject digest:
33c95c8e7d83bf96093ecceb6ee32b3d8461ea351d8a371d8c7b8089647041e7 - Sigstore transparency entry: 519599804
- Sigstore integration time:
-
Permalink:
gabrielbarbosel/browser-core@3984272c8da89922a0848143cc4fa5f075fb2927 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/gabrielbarbosel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-and-publish.yml@3984272c8da89922a0848143cc4fa5f075fb2927 -
Trigger Event:
push
-
Statement type: