<?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ブログ</title>
        <link>https://knightli.com/ja/tags/puppeteer/</link>
        <description>Recent content in Puppeteer on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Sun, 24 May 2026 17:51:28 +0800</lastBuildDate><atom:link href="https://knightli.com/ja/tags/puppeteer/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>browser-harness、Playwright、Puppeteerの選び方：ブラウザ自動化ツール比較</title>
        <link>https://knightli.com/ja/2026/05/24/browser-harness-playwright-puppeteer-comparison/</link>
        <pubDate>Sun, 24 May 2026 17:51:28 +0800</pubDate>
        
        <guid>https://knightli.com/ja/2026/05/24/browser-harness-playwright-puppeteer-comparison/</guid>
        <description>&lt;p&gt;ブラウザ自動化と自動テストの分野では、&lt;code&gt;Playwright&lt;/code&gt; と &lt;code&gt;Puppeteer&lt;/code&gt; がよく比較されます。どちらもブラウザを制御し、ページをクリックし、コンテンツを取得し、スクリーンショットやPDFを生成できます。また、どちらもChrome DevTools Protocolと深い関係があります。&lt;/p&gt;
&lt;p&gt;そこに &lt;code&gt;browser-use/browser-harness&lt;/code&gt; を加えると、問題は「どのテストフレームワークが強いか」だけではなくなります。比較対象は2種類のツールになります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Playwright&lt;/code&gt; / &lt;code&gt;Puppeteer&lt;/code&gt;：人間のエンジニアが決定的なスクリプトを書くためのツール。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser-harness&lt;/code&gt;：AI Agentが実際のブラウザを操作するためのツール。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前者はテスト、スクレイピング、工程化された自動化に向いています。後者はClaude Code、Codex CLI、GeminiのようなAgent向けのブラウザ制御層に近いです。&lt;/p&gt;
&lt;h2 id=&#34;playwrightとpuppeteerの関係&#34;&gt;PlaywrightとPuppeteerの関係
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; はGoogle Chromeチームから生まれ、ChromiumとChrome自動化に自然に最適化されています。APIは簡潔で、エコシステムも成熟しており、Chromeを中心にスクリーンショット、PDF生成、ページ取得、軽量自動化を行うのに向いています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; はMicrosoftが保守しており、初期のPuppeteerに関わる流れとも深い関係があります。Puppeteerから得られた経験を取り込みつつ、クロスブラウザ対応、自動待機、コンテキスト分離、テストレポート、デバッグツールをより充実させています。&lt;/p&gt;
&lt;p&gt;簡単に言うと：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chrome中心の軽量タスクだけなら、&lt;code&gt;Puppeteer&lt;/code&gt; は今でも扱いやすい。&lt;/li&gt;
&lt;li&gt;クロスブラウザE2Eテスト、複雑なSPA自動化、チームでのテスト基盤なら、&lt;code&gt;Playwright&lt;/code&gt; の方が向いていることが多い。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;主な違い&#34;&gt;主な違い
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;観点&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;主導&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;ブラウザ対応&lt;/td&gt;
          &lt;td&gt;主にChrome / Chromium&lt;/td&gt;
          &lt;td&gt;Chromium、Firefox、WebKit&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;言語対応&lt;/td&gt;
          &lt;td&gt;主に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;自動待機&lt;/td&gt;
          &lt;td&gt;明示的な待機が多い&lt;/td&gt;
          &lt;td&gt;Locatorとauto-waitingが強い&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;コンテキスト分離&lt;/td&gt;
          &lt;td&gt;対応しているが中心機能ではない&lt;/td&gt;
          &lt;td&gt;BrowserContextが強力&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ツールチェーン&lt;/td&gt;
          &lt;td&gt;シンプルで成熟&lt;/td&gt;
          &lt;td&gt;Codegen、Trace Viewer、レポートが充実&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;典型用途&lt;/td&gt;
          &lt;td&gt;Chrome自動化、スクリーンショット、PDF、軽量取得&lt;/td&gt;
          &lt;td&gt;クロスブラウザE2Eテスト、複雑なフロントエンド自動化&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;ブラウザ対応&#34;&gt;ブラウザ対応
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; の強みはChromeです。Chromiumとの結びつきが強く、Chrome制御、PDF生成、スクリーンショット、簡単なスクレイピングが目的なら、学習コストは低いです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; の強みはクロスブラウザです。Chromium、Firefox、WebKitをネイティブにサポートします。WebKitは特に重要です。Safari固有の問題はChromeだけでは検出できないことがあるからです。デスクトップ、モバイル、複数エンジンをカバーしたいアプリでは、Playwrightが主力になりやすいです。&lt;/p&gt;
&lt;p&gt;最初の分岐はここです。ChromeだけならPuppeteerで十分です。クロスブラウザテストを本気で行うなら、まずPlaywrightを検討します。&lt;/p&gt;
&lt;h2 id=&#34;自動待機と安定性&#34;&gt;自動待機と安定性
&lt;/h2&gt;&lt;p&gt;ブラウザ自動化で面倒なのは、クリック方法そのものより、ページが準備できているかどうかです。要素がまだDOMにない、覆われている、アニメーション中、disabledのまま、ということがよくあります。&lt;/p&gt;
&lt;p&gt;Puppeteerでは次のように書くことが多いです。&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;問題はありませんが、待機ロジックはエンジニアが考える必要があります。ページが複雑になるほど、&lt;code&gt;waitForSelector&lt;/code&gt;、&lt;code&gt;waitForTimeout&lt;/code&gt;、リトライ処理が増えがちです。&lt;/p&gt;
&lt;p&gt;PlaywrightのLocatorと自動待機はより完成度が高いです。&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;クリック前に、Playwrightは要素が表示され、操作可能で、安定しており、覆われていないかを確認し、合理的な時間内でリトライします。React、Vue、Next.jsのように非同期レンダリングが多い現代的なWebアプリでは、flaky testを減らす上で大きな効果があります。&lt;/p&gt;
&lt;h2 id=&#34;複数アカウントとコンテキスト分離&#34;&gt;複数アカウントとコンテキスト分離
&lt;/h2&gt;&lt;p&gt;複数ユーザーを模擬したい場合や、複数タスクで同じブラウザプロセスを共有しながらCookie、LocalStorage、Sessionを分離したい場合、&lt;code&gt;BrowserContext&lt;/code&gt; が重要です。&lt;/p&gt;
&lt;p&gt;Puppeteerもコンテキスト分離をサポートしますが、Playwrightはそれを中核機能として扱っています。1つのブラウザインスタンス内に、独立したcontextを素早く作れます。それぞれがクリーンなブラウザ環境のように振る舞い、完全なブラウザプロセスを何度も起動する必要がありません。&lt;/p&gt;
&lt;p&gt;これは次の場面で役立ちます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;複数アカウントの並行テスト。&lt;/li&gt;
&lt;li&gt;複数ロールのワークフローテスト。&lt;/li&gt;
&lt;li&gt;EC、IM、共同編集ドキュメントなどの複数ユーザー場面。&lt;/li&gt;
&lt;li&gt;Cookieとログイン状態を分離したい取得タスク。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ツールチェーンの違い&#34;&gt;ツールチェーンの違い
&lt;/h2&gt;&lt;p&gt;Playwrightはより工程化された選択肢です。テスト開発で使う機能が多く内蔵されています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codegen&lt;/code&gt;：Webページ上の操作からスクリプトを自動生成する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Trace Viewer&lt;/code&gt;：失敗時のスクリーンショット、DOM、ネットワーク、consoleログを追跡する。&lt;/li&gt;
&lt;li&gt;Test Runner：アサーション、並列実行、リトライ、レポート、プロジェクト行列に対応。&lt;/li&gt;
&lt;li&gt;Locator：テキスト、role、label、test id、CSSなどで要素を定位する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puppeteerはより軽量なブラウザ制御ライブラリです。肥大化しておらず、APIが直接的で、スクリプト、サーバー側ジョブ、独自の自動化フローに組み込みやすいです。&lt;/p&gt;
&lt;p&gt;企業レベルのテスト基盤を作るなら、Playwrightの周辺ツールが多くの手間を減らします。Node.jsスクリプトでWebページをPDFにしたり定期的にスクリーンショットを撮ったりするだけなら、Puppeteerの方がすっきりします。&lt;/p&gt;
&lt;h2 id=&#34;browser-harnessの位置づけ&#34;&gt;browser-harnessの位置づけ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; はPlaywrightやPuppeteerと同じ種類のツールではありません。&lt;/p&gt;
&lt;p&gt;PlaywrightとPuppeteerは主に「人間がスクリプトを書く」ことを前提にしています。エンジニアがselector、待機条件、アサーション、例外処理を決めます。追求するのは決定性です。同じページ状態で同じスクリプトを実行すれば、同じ結果になるべきです。&lt;/p&gt;
&lt;p&gt;browser-harnessは主に「AI Agentがブラウザを操作する」ことを前提にしています。巨大な高級APIを提供するのではなく、CDPで実際のChromeに接続し、スクリーンショット、座標クリック、DOM、ネットワークリクエスト、helperをAgentに渡します。Agentはページを観察し、次の手を判断し、足りない能力があればhelperを追加し、サイト経験をskillに変えます。&lt;/p&gt;
&lt;p&gt;そのため、次のようなオープンなタスクに向いています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理画面にログインして請求書をダウンロードする。&lt;/li&gt;
&lt;li&gt;社内システムでフォームを入力する。&lt;/li&gt;
&lt;li&gt;よく改版されるOAやSaaSページを扱う。&lt;/li&gt;
&lt;li&gt;固定スクリプトではなく、ユーザーの目的に沿ってページを探索する。&lt;/li&gt;
&lt;li&gt;Claude CodeやCodex CLIにブラウザ操作能力を与える。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3つの比較&#34;&gt;3つの比較
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;観点&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;対象&lt;/td&gt;
          &lt;td&gt;エンジニア&lt;/td&gt;
          &lt;td&gt;エンジニアとテストチーム&lt;/td&gt;
          &lt;td&gt;AI Agent&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;主目的&lt;/td&gt;
          &lt;td&gt;Chromeを制御する&lt;/td&gt;
          &lt;td&gt;安定したクロスブラウザ自動化&lt;/td&gt;
          &lt;td&gt;Agentに実ブラウザを操作させる&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;スクリプト方式&lt;/td&gt;
          &lt;td&gt;手書きJS/TS自動化&lt;/td&gt;
          &lt;td&gt;スクリプト + テストフレームワーク&lt;/td&gt;
          &lt;td&gt;ユーザーが目標を出し、Agentが実行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;要素定位&lt;/td&gt;
          &lt;td&gt;CSS、XPath、DOM API&lt;/td&gt;
          &lt;td&gt;Locator、テキスト、role、CSS&lt;/td&gt;
          &lt;td&gt;スクリーンショット、座標、DOM、CDP&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;待機&lt;/td&gt;
          &lt;td&gt;手動制御が多い&lt;/td&gt;
          &lt;td&gt;自動待機が強い&lt;/td&gt;
          &lt;td&gt;Agentが観察して調整&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ブラウザ環境&lt;/td&gt;
          &lt;td&gt;通常は自動化用ブラウザ&lt;/td&gt;
          &lt;td&gt;通常はテスト用ブラウザ&lt;/td&gt;
          &lt;td&gt;実際のChromeに接続することが多い&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;向いている用途&lt;/td&gt;
          &lt;td&gt;Chromeスクリプト、スクリーンショット、PDF、軽量取得&lt;/td&gt;
          &lt;td&gt;E2Eテスト、クロスブラウザ検証、複雑なSPA&lt;/td&gt;
          &lt;td&gt;AIアシスタント、開かれたWebタスク、実アカウントのワークフロー&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;コードの感触&#34;&gt;コードの感触
&lt;/h2&gt;&lt;p&gt;Puppeteerは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はLocatorと自動待機を強く意識します。&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の体験はまったく違います。通常は完全なスクリプトを書かず、Agent環境で目標を伝えます。&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;管理画面を開いて、先月の請求書をダウンロードし、経費精算用に整理してください。
&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;Agentはbrowser-harnessを使って次のような流れを繰り返します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;スクリーンショットを撮り、現在のページを理解する。&lt;/li&gt;
&lt;li&gt;座標をクリックする、または要素を見つける。&lt;/li&gt;
&lt;li&gt;テキスト入力、ファイルアップロード、ダウンロードを行う。&lt;/li&gt;
&lt;li&gt;ポップアップに遭遇したら閉じ方を判断する。&lt;/li&gt;
&lt;li&gt;helperが足りなければコードを追加する。&lt;/li&gt;
&lt;li&gt;再利用できる流れをdomain skillにする。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは従来のテストスクリプトではなく、ブラウザAgentの作業スタイルです。&lt;/p&gt;
&lt;h2 id=&#34;どう選ぶか&#34;&gt;どう選ぶか
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Puppeteer&lt;/code&gt; を選ぶ理由は次のような場合です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;プロジェクトが主にNode.jsで動く。&lt;/li&gt;
&lt;li&gt;ChromeまたはChromiumだけでよい。&lt;/li&gt;
&lt;li&gt;タスクがスクリーンショット、PDF生成、簡単なページ取得、軽量自動化。&lt;/li&gt;
&lt;li&gt;シンプルなAPI、少ない依存、自分で細部を制御したい。&lt;/li&gt;
&lt;li&gt;Chrome DevTools Protocolへの依存が深い。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; を選ぶ理由は次のような場合です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;標準的なUI自動化やE2Eテストを行う。&lt;/li&gt;
&lt;li&gt;Chromium、Firefox、WebKitをカバーしたい。&lt;/li&gt;
&lt;li&gt;チームの主言語がPython、Java、C#かもしれない。&lt;/li&gt;
&lt;li&gt;ページが複雑なSPAで、非同期状態が多く、flaky testが起きやすい。&lt;/li&gt;
&lt;li&gt;codegen、Trace Viewer、テストレポート、並列テストが必要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; を選ぶ理由は次のような場合です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI Agentを開発または利用している。&lt;/li&gt;
&lt;li&gt;モデルに人間のように実際のブラウザを操作させたい。&lt;/li&gt;
&lt;li&gt;手順が固定されず、ページを見ながら判断する必要がある。&lt;/li&gt;
&lt;li&gt;対象サイトがよく変わる、またはポップアップ、iframe、shadow DOMが多い。&lt;/li&gt;
&lt;li&gt;実際のWebワークフローをClaude Code、Codex CLIなどに任せたい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; と &lt;code&gt;Puppeteer&lt;/code&gt; は、人が信頼できるスクリプトを書くためのブラウザ自動化ツールです。Puppeteerはより軽くChromeに近い。Playwrightはより総合的で、クロスブラウザテストや複雑なフロントエンドアプリに向いています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;browser-harness&lt;/code&gt; は別の方向です。PlaywrightやPuppeteerでテストを書くことを置き換えるためではなく、AI Agentに実際のブラウザを操作させるためのものです。従来のスクリプトが持つ決定性の一部を手放す代わりに、オープンなタスクへの適応力を得ます。&lt;/p&gt;
&lt;p&gt;したがって、答えは三択ではなく、タスクの層で分けるべきです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テスト工程：Playwrightを優先。&lt;/li&gt;
&lt;li&gt;Chromeの軽量スクリプト：Puppeteerが合う。&lt;/li&gt;
&lt;li&gt;AI AgentにWeb上の作業をさせる：browser-harnessを見る。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考資料：&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;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;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>
