<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Puppeteer on KnightLi Blog</title>
        <link>https://knightli.com/es/tags/puppeteer/</link>
        <description>Recent content in Puppeteer on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Sun, 24 May 2026 17:51:28 +0800</lastBuildDate><atom:link href="https://knightli.com/es/tags/puppeteer/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>browser-harness, Playwright y Puppeteer: cómo elegir una herramienta de automatización de navegador</title>
        <link>https://knightli.com/es/2026/05/24/browser-harness-playwright-puppeteer-comparison/</link>
        <pubDate>Sun, 24 May 2026 17:51:28 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/24/browser-harness-playwright-puppeteer-comparison/</guid>
        <description>&lt;p&gt;En automatización de navegadores y pruebas automatizadas, &lt;code&gt;Playwright&lt;/code&gt; y &lt;code&gt;Puppeteer&lt;/code&gt; son dos de las herramientas que más se comparan. Ambas pueden controlar navegadores, hacer clic en páginas, extraer contenido, generar capturas o PDFs, y ambas están muy relacionadas con Chrome DevTools Protocol.&lt;/p&gt;
&lt;p&gt;Al añadir &lt;code&gt;browser-use/browser-harness&lt;/code&gt;, la pregunta deja de ser solo “qué framework de pruebas es más potente”. Pasa a ser una comparación entre dos tipos de herramientas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Playwright&lt;/code&gt; / &lt;code&gt;Puppeteer&lt;/code&gt;: herramientas para que ingenieros escriban scripts deterministas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser-harness&lt;/code&gt;: una herramienta para que AI Agent operen navegadores reales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El primer grupo encaja con pruebas, scraping y automatización de ingeniería. El segundo se parece más a una capa de control de navegador para agentes como Claude Code, Codex CLI y Gemini.&lt;/p&gt;
&lt;h2 id=&#34;relación-entre-playwright-y-puppeteer&#34;&gt;Relación entre Playwright y Puppeteer
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; nació en el equipo de Google Chrome y se orienta de forma natural a Chromium y Chrome. Su API es concisa, el ecosistema es maduro y resulta muy cómodo para capturas, PDFs, extracción de páginas y automatización ligera alrededor de Chrome.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; es mantenido por Microsoft, y su equipo tiene vínculos históricos profundos con el trabajo temprano de Puppeteer. Tomó muchas lecciones de Puppeteer y añadió mejor soporte cross-browser, auto-waiting, aislamiento de contextos, reportes de pruebas y herramientas de depuración.&lt;/p&gt;
&lt;p&gt;En resumen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si solo necesitas tareas ligeras alrededor de Chrome, &lt;code&gt;Puppeteer&lt;/code&gt; sigue siendo muy cómodo.&lt;/li&gt;
&lt;li&gt;Si haces pruebas E2E cross-browser, automatización de SPA complejas o ingeniería de pruebas en equipo, &lt;code&gt;Playwright&lt;/code&gt; suele encajar mejor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;diferencias-principales&#34;&gt;Diferencias principales
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimensión&lt;/th&gt;
          &lt;th&gt;Puppeteer&lt;/th&gt;
          &lt;th&gt;Playwright&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Mantenedor&lt;/td&gt;
          &lt;td&gt;Google&lt;/td&gt;
          &lt;td&gt;Microsoft&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Soporte de navegadores&lt;/td&gt;
          &lt;td&gt;Principalmente Chrome / Chromium&lt;/td&gt;
          &lt;td&gt;Chromium, Firefox, WebKit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Lenguajes&lt;/td&gt;
          &lt;td&gt;Principalmente JavaScript / TypeScript&lt;/td&gt;
          &lt;td&gt;JavaScript / TypeScript, Python, Java, .NET&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Auto-waiting&lt;/td&gt;
          &lt;td&gt;Más esperas explícitas&lt;/td&gt;
          &lt;td&gt;Locator y auto-waiting más completos&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Aislamiento de contextos&lt;/td&gt;
          &lt;td&gt;Soportado, pero menos central&lt;/td&gt;
          &lt;td&gt;BrowserContext muy sólido&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Herramientas&lt;/td&gt;
          &lt;td&gt;Simple, maduro, básico&lt;/td&gt;
          &lt;td&gt;Codegen, Trace Viewer, reportes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Uso típico&lt;/td&gt;
          &lt;td&gt;Automatización de Chrome, capturas, PDF, scraping ligero&lt;/td&gt;
          &lt;td&gt;Pruebas E2E cross-browser, automatización frontend compleja&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;soporte-de-navegadores&#34;&gt;Soporte de navegadores
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; destaca en Chrome. Se integra estrechamente con Chromium. Si tu objetivo es controlar Chrome, generar PDFs, tomar capturas o hacer scraping sencillo, Puppeteer tiene poca carga mental.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; destaca en trabajo cross-browser. Soporta de forma nativa Chromium, Firefox y WebKit. WebKit es importante porque muchos problemas relacionados con Safari no se detectan usando solo Chrome. Para aplicaciones que deben cubrir escritorio, móvil y distintos motores, Playwright es una mejor herramienta principal.&lt;/p&gt;
&lt;p&gt;Esta es la primera frontera de decisión: si solo importa Chrome, Puppeteer está bien. Si necesitas pruebas cross-browser serias, elige primero Playwright.&lt;/p&gt;
&lt;h2 id=&#34;auto-waiting-y-estabilidad&#34;&gt;Auto-waiting y estabilidad
&lt;/h2&gt;&lt;p&gt;Lo más molesto de la automatización de navegador no suele ser “cómo hacer clic”, sino si la página está lista. Un elemento puede no estar en el DOM, estar cubierto, seguir animándose o continuar deshabilitado.&lt;/p&gt;
&lt;p&gt;En Puppeteer se suele escribir:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitForSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Funciona, pero el ingeniero debe pensar la lógica de espera. Cuanto más compleja es la página, más aparecen &lt;code&gt;waitForSelector&lt;/code&gt;, &lt;code&gt;waitForTimeout&lt;/code&gt; y reintentos manuales.&lt;/p&gt;
&lt;p&gt;El mecanismo de Locator y auto-waiting de Playwright es más completo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;locator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Antes de hacer clic, Playwright comprueba si el elemento es visible, accionable, estable y no está cubierto, y reintenta durante un tiempo razonable. Esto importa mucho en aplicaciones modernas con React, Vue o Next.js, donde hay mucho renderizado asíncrono y flaky tests.&lt;/p&gt;
&lt;h2 id=&#34;múltiples-cuentas-y-aislamiento-de-contextos&#34;&gt;Múltiples cuentas y aislamiento de contextos
&lt;/h2&gt;&lt;p&gt;Si necesitas simular varios usuarios, o permitir que varias tareas compartan un proceso de navegador pero separen Cookie, LocalStorage y Session, &lt;code&gt;BrowserContext&lt;/code&gt; es importante.&lt;/p&gt;
&lt;p&gt;Puppeteer también soporta aislamiento de contextos, pero Playwright lo convierte en capacidad central. Puedes crear varios contextos independientes dentro de una misma instancia de navegador. Cada contexto se comporta como un navegador limpio sin iniciar procesos completos una y otra vez.&lt;/p&gt;
&lt;p&gt;Esto es útil para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pruebas concurrentes con múltiples cuentas.&lt;/li&gt;
&lt;li&gt;Pruebas de flujos con varios roles.&lt;/li&gt;
&lt;li&gt;Ecommerce, mensajería y documentos colaborativos.&lt;/li&gt;
&lt;li&gt;Tareas de extracción que necesitan aislar Cookie y estado de login.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;diferencias-de-herramientas&#34;&gt;Diferencias de herramientas
&lt;/h2&gt;&lt;p&gt;Playwright es la opción más orientada a ingeniería. Incluye herramientas usadas en desarrollo de pruebas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codegen&lt;/code&gt;: operar en una página y generar scripts automáticamente.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trace Viewer&lt;/code&gt;: revisar capturas, DOM, red y console logs tras un fallo.&lt;/li&gt;
&lt;li&gt;Test Runner: assertions, paralelismo, reintentos, reportes y matrices de proyectos.&lt;/li&gt;
&lt;li&gt;Locator: selección por texto, role, label, test id y CSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puppeteer se parece más a una biblioteca ligera de control de navegador. No es pesada, su API es directa y se integra bien en scripts, tareas de servidor y flujos personalizados.&lt;/p&gt;
&lt;p&gt;Si construyes un sistema de pruebas empresarial, las herramientas de Playwright ahorran mucho trabajo. Si solo necesitas un script Node.js para convertir páginas a PDF o hacer capturas programadas, Puppeteer puede ser más directo.&lt;/p&gt;
&lt;h2 id=&#34;dónde-encaja-browser-harness&#34;&gt;Dónde encaja browser-harness
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; no es el mismo tipo de herramienta que Playwright o Puppeteer.&lt;/p&gt;
&lt;p&gt;Playwright y Puppeteer asumen sobre todo que humanos escriben scripts. Los ingenieros deciden selectores, condiciones de espera, assertions y manejo de excepciones. Buscan determinismo: el mismo script debería producir el mismo resultado bajo el mismo estado de página.&lt;/p&gt;
&lt;p&gt;browser-harness asume sobre todo que un AI Agent opera el navegador. Su objetivo no es ofrecer una enorme API de alto nivel, sino conectarse a Chrome real mediante CDP y exponer capturas, clics por coordenadas, DOM, solicitudes de red y helpers al agente. El agente puede observar la página, decidir el siguiente paso, añadir helpers cuando falta capacidad y convertir experiencia del sitio en skills.&lt;/p&gt;
&lt;p&gt;Por eso encaja mejor con tareas abiertas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Iniciar sesión en un backend y descargar facturas.&lt;/li&gt;
&lt;li&gt;Rellenar formularios en un sistema interno.&lt;/li&gt;
&lt;li&gt;Manejar páginas OA o SaaS que cambian con frecuencia.&lt;/li&gt;
&lt;li&gt;Explorar una página según un objetivo del usuario, no ejecutar un script fijo.&lt;/li&gt;
&lt;li&gt;Dar capacidad de navegador a Claude Code, Codex CLI y herramientas similares.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;comparación-de-los-tres&#34;&gt;Comparación de los tres
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimensión&lt;/th&gt;
          &lt;th&gt;Puppeteer&lt;/th&gt;
          &lt;th&gt;Playwright&lt;/th&gt;
          &lt;th&gt;browser-harness&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Usuario objetivo&lt;/td&gt;
          &lt;td&gt;Ingenieros&lt;/td&gt;
          &lt;td&gt;Ingenieros y equipos de prueba&lt;/td&gt;
          &lt;td&gt;AI Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Objetivo principal&lt;/td&gt;
          &lt;td&gt;Controlar Chrome&lt;/td&gt;
          &lt;td&gt;Automatización cross-browser estable&lt;/td&gt;
          &lt;td&gt;Permitir que agentes operen navegadores reales&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Estilo&lt;/td&gt;
          &lt;td&gt;Automatización JS/TS escrita a mano&lt;/td&gt;
          &lt;td&gt;Scripts más framework de pruebas&lt;/td&gt;
          &lt;td&gt;Usuario da un objetivo, el agente ejecuta pasos&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Localización&lt;/td&gt;
          &lt;td&gt;CSS, XPath, DOM API&lt;/td&gt;
          &lt;td&gt;Locator, texto, role, CSS&lt;/td&gt;
          &lt;td&gt;Capturas, coordenadas, DOM, CDP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Esperas&lt;/td&gt;
          &lt;td&gt;Más control manual&lt;/td&gt;
          &lt;td&gt;Auto-waiting fuerte&lt;/td&gt;
          &lt;td&gt;El agente observa y ajusta&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Entorno&lt;/td&gt;
          &lt;td&gt;Normalmente navegador automatizado&lt;/td&gt;
          &lt;td&gt;Normalmente navegador de pruebas&lt;/td&gt;
          &lt;td&gt;A menudo Chrome real&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Mejor uso&lt;/td&gt;
          &lt;td&gt;Scripts Chrome, capturas, PDF, scraping ligero&lt;/td&gt;
          &lt;td&gt;E2E, validación cross-browser, SPA complejas&lt;/td&gt;
          &lt;td&gt;Asistentes AI, tareas web abiertas, flujos con cuentas reales&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;sensación-de-código&#34;&gt;Sensación de código
&lt;/h2&gt;&lt;p&gt;Puppeteer se siente más cercano al control directo de Chrome:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;puppeteer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;puppeteer&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;puppeteer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;waitForSelector&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Playwright enfatiza Locator y auto-waiting:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chromium&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;playwright&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;chromium&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;launch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newPage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;goto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://example.com&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;locator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;#submit-btn&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;click&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;browser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;close&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;browser-harness se siente completamente distinto. Normalmente no escribes un script completo. Das un objetivo dentro de un entorno de agente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Abre el panel de administración, descarga la factura del mes pasado y organízala para reembolso.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El agente usa browser-harness repetidamente para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tomar capturas y entender la página actual.&lt;/li&gt;
&lt;li&gt;Hacer clic en una coordenada o localizar un elemento.&lt;/li&gt;
&lt;li&gt;Escribir texto, subir archivos y descargar archivos.&lt;/li&gt;
&lt;li&gt;Decidir cómo cerrar popups.&lt;/li&gt;
&lt;li&gt;Añadir código helper cuando falta algo.&lt;/li&gt;
&lt;li&gt;Convertir flujos reutilizables en domain skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ese no es el estilo de un script de pruebas tradicional. Es el flujo de trabajo de un browser agent.&lt;/p&gt;
&lt;h2 id=&#34;cómo-elegir&#34;&gt;Cómo elegir
&lt;/h2&gt;&lt;p&gt;Elige &lt;code&gt;Puppeteer&lt;/code&gt; cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El proyecto corre principalmente en Node.js.&lt;/li&gt;
&lt;li&gt;Solo necesitas Chrome o Chromium.&lt;/li&gt;
&lt;li&gt;La tarea es captura, PDF, scraping simple o automatización ligera.&lt;/li&gt;
&lt;li&gt;Quieres una API simple, pocas dependencias y más control manual.&lt;/li&gt;
&lt;li&gt;Dependendes mucho de Chrome DevTools Protocol.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elige &lt;code&gt;Playwright&lt;/code&gt; cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Construyes automatización UI estándar o pruebas E2E.&lt;/li&gt;
&lt;li&gt;Necesitas cubrir Chromium, Firefox y WebKit.&lt;/li&gt;
&lt;li&gt;El lenguaje principal del equipo puede ser Python, Java o C#.&lt;/li&gt;
&lt;li&gt;La página es una SPA compleja con muchos estados asíncronos y riesgo de flaky tests.&lt;/li&gt;
&lt;li&gt;Necesitas codegen, Trace Viewer, reportes y pruebas paralelas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elige &lt;code&gt;browser-harness&lt;/code&gt; cuando:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Desarrollas o usas AI Agent.&lt;/li&gt;
&lt;li&gt;Quieres que el modelo opere un navegador real como una persona.&lt;/li&gt;
&lt;li&gt;Los pasos de la tarea no son fijos y requieren juicio página por página.&lt;/li&gt;
&lt;li&gt;El sitio cambia a menudo o tiene muchos popups, iframes y shadow DOM.&lt;/li&gt;
&lt;li&gt;Quieres que flujos web reales sean manejados por Claude Code, Codex CLI u otras herramientas similares.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;conclusión&#34;&gt;Conclusión
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; y &lt;code&gt;Puppeteer&lt;/code&gt; son herramientas de automatización de navegador cuyo objetivo central es permitir que humanos escriban scripts fiables. Puppeteer es más ligero y cercano a Chrome. Playwright es más completo y encaja mejor con pruebas cross-browser y aplicaciones frontend complejas.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; apunta en otra dirección. No está pensado para reemplazar a Playwright o Puppeteer en pruebas. Está pensado para permitir que AI Agent controlen navegadores reales. Sacrifica parte del determinismo de los scripts tradicionales a cambio de más adaptación en tareas abiertas.&lt;/p&gt;
&lt;p&gt;Así que no se trata de elegir solo uno. Conviene separar por capa de tarea:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ingeniería de pruebas: Playwright primero.&lt;/li&gt;
&lt;li&gt;Scripts ligeros de Chrome: Puppeteer encaja bien.&lt;/li&gt;
&lt;li&gt;AI Agent trabajando en la web: mira browser-harness.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;browser-use/browser-harness: &lt;a class=&#34;link&#34; href=&#34;https://github.com/browser-use/browser-harness&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/browser-use/browser-harness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentación de Playwright: &lt;a class=&#34;link&#34; href=&#34;https://playwright.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://playwright.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentación de Puppeteer: &lt;a class=&#34;link&#34; href=&#34;https://pptr.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://pptr.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Chrome DevTools Protocol: &lt;a class=&#34;link&#34; href=&#34;https://chromedevtools.github.io/devtools-protocol/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://chromedevtools.github.io/devtools-protocol/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
