🤖 Automação de Navegador em Segundo Plano (CDP)
Como operar sites logados sem roubar o foco da máquina (útil quando o usuário está
trabalhando em outro app, ou para rodar verificações automáticas).
Arquitetura
┌──────────────────────┐ WebSocket (CDP) ┌───────────────────────────┐
│ cdp.mjs (Node puro) │ ──────────────────► │ Chrome headless :9222 │
│ nav/click/type/shot │ │ perfil: /tmp/.../cdp-... │
└──────────────────────┘ │ (cookies copiados!) │
└───────────────────────────┘
1. Subir o Chrome "invisível"
# (opcional, uma vez) copiar a sessão do perfil real para o novo perfil
mkdir -p /tmp/opencode/cdp-profile/Default
cp -a ~/.config/google-chrome/Default/Cookies /tmp/opencode/cdp-profile/Default/
cp -a "$HOME/.config/google-chrome/Local State" /tmp/opencode/cdp-profile/
cp -a ~/.config/google-chrome/Default/Preferences /tmp/opencode/cdp-profile/Default/
subir o Chrome headless com CDP
google-chrome --headless=new --remote-debugging-port=9222 \
--user-data-dir=/tmp/opencode/cdp-profile \
--no-first-run --no-default-browser-check \
--disable-background-timer-throttling --disable-renderer-backgrounding \
--disable-backgrounding-occluded-windows \
--window-size=1920,1020 about:blank &
verificar
curl -s http://127.0.0.1:9222/json/version
Dica: o perfil copiado herda os cookies → a sessão já vem autenticada
(sem precisar de senha). Em contas com keyring, a chave é a mesma do usuário.
2. Usar o script
node cdp.mjs nav "https://site" 10000 # navegar (espera 10s)
node cdp.mjs url # URL atual
node cdp.mjs eval "document.title" # rodar JS (retorna valor)
node cdp.mjs click 500 300 # clicar (coordenadas CSS)
node cdp.mjs type "texto" # digitar texto
node cdp.mjs key ctrl+shift+p # tecla/combo (ctrl+a, tab, enter, escape...)
node cdp.mjs shot print.png # screenshot (PNG)
Seleção de aba (quando há mais de uma):
T=applicationstudio node cdp.mjs shot ide.png # escolhe a aba cuja URL contém "applicationstudio"
3. Limites conhecidos
| Limite | Detalhe |
| Workbench SAP (BAS/Build Code) | Roda em iframes que ignoram eventos sintéticos (CDP e XTEST). Testado com Emulation.setFocusEmulationEnabled e sem device metrics override. |
| SPA pesadas | Primeira carga pode travar o renderer no headless (aguardar/recarregar) |
| Keyring | Se o Chrome usar keyring bloqueado, os cookies copiados não decifram |
4. Bônus: login SSO do Cloud Foundry sem interação
# 1) navegar para a página de passcode (o navegador já está logado)
node cdp.mjs nav "https://login.cf.us10-001.hana.ondemand.com/passcode" 12000
2) clicar na conta e ler o código
node cdp.mjs click <x> <y>
node cdp.mjs eval "document.body.innerText" # → "Temporary Authentication Code \n XXXXX"
3) usar no cf
cf login -a https://api.cf.us10-001.hana.ondemand.com --sso-passcode <CODIGO>
Isso permitiu renovar a sessão do cf sem depender de ação humana.
5. Alternativas quando o CDP não serve
- xdotool (XTEST, precisa de foco):
xdotool windowactivate <id>; xdotool type ... - ffmpeg para capturar a tela:
ffmpeg -f x11grab -video_size 1920x1020 -i :0.0+0,0 -frames:v 1 tela.png - APIs/CLI nativos (sempre preferíveis):
btp,cf,curl -A "<UA>"