El agente controla un navegador Chrome real para extraer datos de pricing de 3 competidores de
NutriBox SaaS. Sigue las reglas de la skill:
preferir API de red sobre DOM scraping, verificar matches, y re-state tras cada navegación.
# Paso 0: Verificar prerequisites (Regla: hasta que doctor sea verde nada funciona) opencli doctor { "status": "ok", "chrome": { "connected": true, "version": "125.0.6422.60", "port": 9222 }, "extension": { "installed": true, "version": "1.0.8", "bridge": true }, "adapters": 24 } # Sesión nombrada para todo el flujo (nombre estable, reutilizable entre comandos) opencli browser nutri-audit open "https://nutricalepro.example.com/pricing"
La sesión nutri-audit se mantiene entre todos los comandos siguientes. Se usa la misma sesión para las 3 URLs.
# Siempre inspect antes de actuar — y preferir network sobre DOM scraping opencli browser nutri-audit network --filter "plans,price" [ { "key": "pricing-api-a3f1", "method": "GET", "status": 200, "url": "https://nutricalepro.example.com/api/pricing/plans", "ct": "application/json", "size": 1842, "shape": "{ plans[]: { id, name, price_monthly, price_annual, limits: { patients }, features[] } }" } ] # La API existe — extraer el body directamente (más fiable que DOM) opencli browser nutri-audit network --detail pricing-api-a3f1
"plans": [ { "id": "starter", "name": "NutriCalc Básico", "price_monthly": 19, "price_annual": 15, "limits": { "patients": 50 }, "features": ["Planificación nutricional", "PDF básico"] }, { "id": "pro", "name": "NutriCalc Pro", "price_monthly": 39, "price_annual": 31, "limits": { "patients": 200 }, "features": ["Analítica avanzada", "Integración EHR", "App paciente"] } ], "match_via": "json_api", "timestamp": "2026-06-16T09:14:22Z"
DietSoft renderiza precios desde server-side. Fallback correcto: state → numeric refs → get text/value.
opencli browser nutri-audit open "https://dietsoft.example.com/plans" opencli browser nutri-audit wait selector ".pricing-card" --timeout 12000 # Regla 1: state primero para obtener refs opencli browser nutri-audit state { "url": "https://dietsoft.example.com/plans", "title": "Planes DietSoft — Gestión de Dietistas", "refs": [ "[1] nav.main-nav", "[2] section.hero h1: 'Elige tu plan'", "[3] .pricing-card.card--basic h3: 'DietSoft Básico'", "[4] .pricing-card.card--basic .price: '22 €/mes'", "[5] .pricing-card.card--basic .patients: 'Hasta 30 pacientes'", "[6] .pricing-card.card--basic button: 'Empezar gratis'", "[7] .pricing-card.card--clinic h3: 'DietSoft Clínica'", "[8] .pricing-card.card--clinic .price: '85 €/mes'", "[9] .pricing-card.card--clinic .patients: 'Pacientes ilimitados'", "[10] .pricing-card.card--clinic button: 'Solicitar demo'", "..." ], "compounds": {} } # Extraer valores usando refs numéricos (Regla 3: preferir ref numérico sobre CSS) opencli browser nutri-audit get text 4 { "value": "22 €/mes", "matches_n": 1, "match_level": "exact" } opencli browser nutri-audit get text 8 { "value": "85 €/mes", "matches_n": 1, "match_level": "exact" } # Buscar precio anual con find (tabla de toggle anual/mensual) opencli browser nutri-audit click --role button --name "Facturación anual" opencli browser nutri-audit wait text "ahorro" --timeout 3000 # ⚠ Regla 7: re-state tras cambio de contenido SPA opencli browser nutri-audit state { ..., "refs": [ "[4] .pricing-card.card--basic .price: '18 €/mes'", ← precio anual actualizado "[8] .pricing-card.card--clinic .price: '69 €/mes'", ... ] }
opencli browser nutri-audit open "https://clininutrition.example.com/pricing" opencli browser nutri-audit network --filter "pricing,tiers" [ { "key": "pricing-b7e2", "url": "/api/v2/pricing/tiers", "shape": "{ tiers[]: {...} }" } ] opencli browser nutri-audit network --detail pricing-b7e2 { "tiers": [ { "name": "CliniNutri Starter", "price_monthly": 29, "price_annual": 23, "patients": 75 }, { "name": "CliniNutri Pro", "price_monthly": 79, "price_annual": 63, "patients": 500 }, { "name": "CliniNutri Enterprise", "price_monthly": null, "price_annual": null, "patients": "unlimited", "cta": "Contactar ventas" } ] } # Enterprise requiere formulario — demostrar fill + verify (Regla 6) opencli browser nutri-audit click --role button --name "Contactar ventas" opencli browser nutri-audit wait selector "form[data-form=enterprise]" opencli browser nutri-audit state # Regla 7: re-state tras nav SPA { "refs": [ "[3] input[name=company]: ''", "[4] input[name=email]: ''", "[5] select[name=clinics] → compound: { control: 'select', options: ['1-5','6-20','21-100','+100'] }", "[6] button[type=submit]: 'Solicitar precio'" ] } # Rellenar con datos del agente NutriBox (simulación de prospección inversa) opencli browser nutri-audit type 3 "NutriBox SaaS" opencli browser nutri-audit type 4 "research@nutribox.io" # Usar compound para select — Regla 5: no adivinar opciones opencli browser nutri-audit select 5 "6-20" opencli browser nutri-audit get value 5 # Regla 6: verificar { "value": "6-20", "matches_n": 1, "match_level": "exact" }
| Competidor | Plan | €/mes | €/mes (anual) | Pacientes | Funcionalidades clave | Fuente |
|---|---|---|---|---|---|---|
| NutriCalc Pro | Básico | 19 € | 15 € -21% anual |
50 |
|
JSON API |
| Pro | 39 € | 31 € -21% anual |
200 |
|
JSON API | |
| DietSoft | Básico | 22 € | 18 € -18% anual |
30 |
|
DOM refs |
| Clínica | 85 € | 69 € -19% anual |
∞ |
|
DOM refs | |
| CliniNutrition | Starter | 29 € | 23 € -21% anual |
75 |
|
JSON API |
| Pro | 79 € | 63 € -20% anual |
500 |
|
JSON API | |
| Enterprise | — | — | ∞ |
|
Form envío |
NutriBox Pro (29 €/mes) compite directamente con DietSoft Básico (22 €) y CliniNutri Starter (29 €), pero ofrece 3× más pacientes (hasta 150 vs 30-75). En el segmento clínica, NutriBox Clínica (99 €) es el más competitivo de los tres con pacientes ilimitados. Oportunidad: comunicar ROI por paciente, no precio absoluto.