この記事の対象読者
- Pythonの基本(pip install、async/await)を理解している方
- SeleniumやPlaywrightなどのブラウザ自動化ツールを使ったことがある、または興味がある方
- 「AIにブラウザを操作させて、Webタスクを自動化したい」と考えている方
この記事で得られること
- Browser-Useの全体像: なぜGitHub星78,000を超える人気プロジェクトになったのか
- 導入から実行まで: Python環境でのセットアップと、AIブラウザエージェントの構築方法
- 3つの実践ユースケース: Web情報収集、フォーム自動入力、ECサイト価格監視
この記事で扱わないこと
- Playwright/Selenium単体の詳細チュートリアル
- Browser-Use Cloudの有料プラン詳細
- 本番環境でのアンチボット対策(Cloudflare回避等)の詳細
1. Browser-Useとの出会い
Webスクレイピングをやったことがある人なら、こんな経験はないだろうか。
「ログイン画面、CAPTCHAが出てきた...」「動的ロードのページ、Seleniumで待機処理書くのめんどくさい...」「そもそもこのサイト、DOM構造がぐちゃぐちゃで要素が見つからない...」
私自身、ある技術ブログの記事データを定期収集するスクリプトを書いていたとき、サイトリニューアルのたびにセレクタが壊れてメンテナンス地獄に陥った。CSSセレクタやXPathで要素を指定する従来の方法は、サイト構造が変わった瞬間に全て崩壊する。
「AIが人間と同じように"画面を見て""理解して""操作する"ことができれば、こんな問題は起きないのに」——そう思っていたとき出会ったのが Browser-Use だ。
Browser-Useは、料理に例えるなら、「レシピ(セレクタ)を暗記して料理する」のではなく「目の前の食材を見て臨機応変に料理できるシェフ」のようなもの。AIがWebページを「見て」理解し、人間と同じように操作する。セレクタ指定は不要。サイト構造が変わっても動く。
ここまでで、Browser-Useがどんなものか、なんとなくイメージできたでしょうか。次は、この記事で使う用語を整理しておきましょう。
2. 前提知識の確認
本題に入る前に、この記事で登場する用語を確認します。
2.1 Playwright とは
Microsoftが開発するブラウザ自動化ライブラリ。Chromium、Firefox、WebKitに対応し、ヘッドレス(画面なし)でもヘッドフル(画面あり)でもブラウザを制御できる。Browser-UseはPlaywrightの上に構築されている。
2.2 DOM蒸留(DOM Distillation)とは
Webページの全DOM(HTML要素の木構造)は巨大で、そのままLLMに渡すとトークン数が爆発する。DOM蒸留は、ページ内の操作可能な要素(ボタン、リンク、入力欄など)だけを抽出してLLMに渡す技術。Browser-Useのコア技術の一つだ。
2.3 WebVoyager ベンチマークとは
AIブラウザエージェントの性能を測定する標準的なベンチマーク。586の多様なWebタスクで構成される。Browser-Useは89.1%の成功率を記録し、2026年2月時点でSOTA(最先端)を達成している。
2.4 マルチタブ操作とは
人間がブラウザの複数タブを切り替えて作業するように、AIエージェントも複数タブを同時に開いて操作できること。Browser-Useはこれをネイティブサポートしている。
これらの用語が押さえられたら、Browser-Useの背景を見ていきましょう。
3. Browser-Useが生まれた背景
3.1 AIブラウザ自動化の進化
Webブラウザの自動化は、大きく3つの世代に分けられる。
| 世代 | 時代 | アプローチ | 課題 |
|---|---|---|---|
| 第1世代 | 2010年代前半 | Selenium + CSSセレクタ | 脆弱なセレクタ、メンテ地獄 |
| 第2世代 | 2020年代前半 | Playwright + ヘッドレス | 高速だがセレクタ依存は同じ |
| 第3世代 | 2025年〜 | AI + ビジュアル理解 | セレクタ不要、AIが「見て」操作 |
Browser-Useは第3世代の代表格であり、「ブラウザ自動化をAIネイティブに再定義した」プロジェクトだ。
3.2 競合との位置づけ
2026年のAIブラウザ自動化市場は急速に拡大している。
| プロジェクト | GitHub Stars | 特徴 |
|---|---|---|
| Browser-Use | 78,000+ | OSSフレームワーク。Python。モデル非依存 |
| OpenAI Operator | 非公開(商用) | CUA(Computer-Using Agent)搭載。ChatGPTと統合 |
| Vercel agent-browser | 14,000+ | Rust製CLI。コンテキスト効率93%削減 |
| Stagehand | 12,000+ | TypeScript。Playwrightのラッパー |
| BrowserOS | 新興 | Chromiumフォーク。ブラウザ自体にAI内蔵 |
Browser-Useの強みは、「OSSかつモデル非依存」という点だ。OpenAI、Anthropic、Google、ローカルモデル(Ollama経由)など、好きなLLMを選べる。
3.3 ROSS Index 2025での評価
Runa CapitalのOSSスタートアップランキング(ROSS Index)2025年版で、Browser-Useは4位にランクイン。74,200 GitHub Starsで、24.0倍の成長率を記録した。
背景がわかったところで、基本的な仕組みを見ていきましょう。
4. 基本概念と仕組み
4.1 処理フロー
Browser-Useの処理は以下の流れで進む:
ユーザーがタスクを記述(自然言語)
│
▼
┌─────────────────┐
│ Agent(司令塔) │ ← LLMにタスクを分解させる
└────────┬────────┘
│
▼
┌─────────────────┐
│ DOM蒸留 │ ← ページの操作可能要素を抽出
│ (DOM Distiller) │ トークン消費を大幅削減
└────────┬────────┘
│
▼
┌─────────────────┐
│ LLM推論 │ ← 「次にどの要素をどう操作するか」を判断
│ (思考→行動) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Playwright実行 │ ← 実際のブラウザ操作を実行
│ (クリック/入力等) │
└────────┬────────┘
│
▼
結果を確認 → 完了 or 次のステップへループ
4.2 DOM蒸留の仕組み
Browser-Useが高い成功率を実現している秘密は、DOM蒸留にある。
通常のDOM: 数万要素、トークン数は10万以上
蒸留後のDOM: 操作可能要素のみ、トークン数は数百〜数千
# 蒸留前(生DOM)— 大量のノイズ
<div class="sc-1234 wrapper">
<div class="sc-5678 inner">
<div class="sc-9012 content">
<button class="sc-3456" data-testid="submit-btn"
aria-label="Submit form">
送信
</button>
</div>
</div>
</div>
# 蒸留後 — 必要な情報だけ
[button] "送信" (clickable, index=42)
4.3 カスタムツール(Actions)
Browser-Use は標準のブラウザ操作に加え、カスタムツール(Actions)を定義できる。これにより、LLMが使える「道具」を拡張できる。
from browser_use import Tools
tools = Tools()
@tools.action(description="現在のページのスクリーンショットを保存する")
def save_screenshot(filename: str) -> str:
"""カスタムアクションの例"""
return f"スクリーンショットを {filename} に保存しました"
基本概念が理解できたところで、実際にコードを書いて動かしてみましょう。
5. 実践:実際に使ってみよう
5.1 環境構築
前提条件
| 項目 | 要件 |
|---|---|
| Python | 3.11以上 |
| OS | Windows 10+, macOS 12+, Linux |
| LLM APIキー | OpenAI / Anthropic / Google のいずれか |
| ディスク容量 | Chromiumダウンロード用に約500MB |
インストール手順
# 1. uvを使った環境構築(推奨)
uv init browser-use-demo && cd browser-use-demo
uv add browser-use
uv sync
# 2. Chromiumのインストール(未インストールの場合)
uvx browser-use install
# 3. 環境変数の設定
# .envファイルを作成
echo "ANTHROPIC_API_KEY=your-key-here" > .env
pipを使う場合:
pip install browser-use --break-system-packages
playwright install chromium
5.2 環境別の設定ファイル
Browser-Useの設定は .env と Python コード内で管理する。以下の3パターンを用意した。
開発環境用(.env.development)
# .env.development - 開発環境用(このままコピーして使える)
# LLMプロバイダ設定(Sonnetでコスト抑制)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx
# ブラウザ設定
BROWSER_HEADLESS=false # 開発時はブラウザを表示(デバッグ用)
BROWSER_SLOW_MO=500 # 操作間に500msの遅延(動作確認用)
BROWSER_TIMEOUT=60000 # タイムアウト60秒
# エージェント設定
AGENT_MAX_STEPS=20 # 最大ステップ数(開発時は少なめ)
AGENT_VERBOSE=true # 詳細ログ出力
本番環境用(.env.production)
# .env.production - 本番環境用
# LLMプロバイダ設定(高性能モデル)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx
# ブラウザ設定
BROWSER_HEADLESS=true # ヘッドレスモード(サーバー向け)
BROWSER_SLOW_MO=0 # 遅延なし(高速実行)
BROWSER_TIMEOUT=120000 # タイムアウト120秒(複雑なタスク対応)
# エージェント設定
AGENT_MAX_STEPS=50 # 最大ステップ数(本番は余裕を持たせる)
AGENT_VERBOSE=false # ログ最小化
# プロキシ設定(必要に応じて)
# BROWSER_PROXY=http://proxy.example.com:8080
テスト環境用(.env.test)
# .env.test - CI/テスト用
# LLMプロバイダ設定(Haikuでコスト最小化)
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxx
# ブラウザ設定
BROWSER_HEADLESS=true # CI環境ではヘッドレス必須
BROWSER_SLOW_MO=0
BROWSER_TIMEOUT=30000 # テストは短めのタイムアウト
# エージェント設定
AGENT_MAX_STEPS=10 # テストはステップ数を制限
AGENT_VERBOSE=true # テスト結果の確認用
5.3 基本的な使い方
"""
Browser-Use 基本サンプル
- AIがブラウザを操作してWeb検索を行う
実行方法: python browser_use_basic.py
"""
import asyncio
import os
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig
from langchain_anthropic import ChatAnthropic
# 環境変数の読み込み
load_dotenv()
async def main():
"""メイン処理: AIにWeb検索を実行させる"""
# 1. ブラウザの設定
browser_config = BrowserConfig(
headless=os.getenv("BROWSER_HEADLESS", "false").lower() == "true",
slow_mo=int(os.getenv("BROWSER_SLOW_MO", "500")),
)
browser = Browser(config=browser_config)
# 2. LLMの設定
llm = ChatAnthropic(
model="claude-sonnet-4-5-20250929",
api_key=os.getenv("ANTHROPIC_API_KEY"),
timeout=60,
temperature=0.0, # 確定的な操作にはtemperature=0
)
# 3. エージェントの作成と実行
agent = Agent(
task=(
"Googleで 'Python 3.13 new features' を検索し、"
"最初の検索結果のタイトルとURLを3件教えてください。"
),
llm=llm,
browser=browser,
max_steps=int(os.getenv("AGENT_MAX_STEPS", "20")),
)
# 4. 実行
result = await agent.run()
print(f"\n=== 実行結果 ===\n{result}")
# 5. ブラウザを閉じる
await browser.close()
if __name__ == "__main__":
asyncio.run(main())
5.4 実行結果
上記のコードを実行すると、以下のような出力が得られる:
$ python browser_use_basic.py
[Agent] Starting task: Googleで 'Python 3.13 new features' を検索し...
[Agent] Step 1: Navigating to https://www.google.com
[Agent] Step 2: Found search box, typing query...
[Agent] Step 3: Clicking search button
[Agent] Step 4: Extracting search results...
[Agent] Step 5: Task completed
=== 実行結果 ===
検索結果TOP3:
1. "What's New In Python 3.13" - https://docs.python.org/3/whatsnew/3.13.html
2. "Python 3.13: Cool New Features for You to Try" - https://realpython.com/python313-new-features/
3. "Python 3.13 Release Notes" - https://www.python.org/downloads/release/python-3130/
5.5 よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
playwright._impl._errors.Error: Executable doesn't exist |
Chromiumが未インストール |
playwright install chromium を実行 |
anthropic.AuthenticationError: 401 |
APIキーが不正または未設定 |
.env ファイルの ANTHROPIC_API_KEY を確認 |
TimeoutError: Page.goto: Timeout 30000ms exceeded |
ページ読み込みが遅い |
BROWSER_TIMEOUT を増やす(60000以上推奨) |
Agent reached max_steps without completing task |
タスクが複雑すぎる、またはステップ数が少なすぎる |
max_steps を増やす、またはタスクを分割 |
Error: Browser context was closed |
ブラウザがクラッシュした | メモリ不足の可能性。他のChromeプロセスを終了するか、ヘッドレスモードで実行 |
5.6 環境診断スクリプト
#!/usr/bin/env python3
"""
Browser-Use 環境診断スクリプト
実行方法: python check_browser_use_env.py
"""
import sys
import os
import subprocess
import shutil
def check_environment():
"""環境をチェックして問題を報告"""
issues = []
warnings = []
# Python バージョン確認
if sys.version_info < (3, 11):
issues.append(
f"Python 3.11以上が必要です(現在: {sys.version})"
)
else:
print(f"✅ Python {sys.version_info.major}.{sys.version_info.minor}")
# browser-use パッケージ確認
try:
import browser_use
print(f"✅ browser-use がインストール済み")
except ImportError:
issues.append(
"browser-use がインストールされていません。"
"`pip install browser-use` を実行してください"
)
# playwright 確認
try:
import playwright
print("✅ playwright がインストール済み")
except ImportError:
issues.append(
"playwright がインストールされていません。"
"`pip install playwright` を実行してください"
)
# Chromium 確認
try:
result = subprocess.run(
["playwright", "install", "--dry-run", "chromium"],
capture_output=True, text=True, timeout=10
)
if "already installed" in result.stdout.lower() or result.returncode == 0:
print("✅ Chromium がインストール済み")
else:
warnings.append(
"Chromium が未インストールの可能性。"
"`playwright install chromium` を実行してください"
)
except (FileNotFoundError, subprocess.TimeoutExpired):
warnings.append("playwright CLI が見つかりません")
# 環境変数確認
api_keys = {
"ANTHROPIC_API_KEY": "Anthropic (Claude)",
"OPENAI_API_KEY": "OpenAI (GPT)",
"GOOGLE_API_KEY": "Google (Gemini)",
}
found_key = False
for key, provider in api_keys.items():
if os.environ.get(key):
print(f"✅ {key} が設定済み ({provider})")
found_key = True
# .envファイル確認
if not found_key:
env_files = [".env", ".env.development", ".env.production"]
for env_file in env_files:
if os.path.exists(env_file):
print(f"📄 {env_file} が存在します")
found_key = True
break
if not found_key:
warnings.append(
"LLM APIキーが環境変数にも.envファイルにも"
"見つかりません"
)
# 結果表示
if issues:
print(f"\n❌ {len(issues)}件の問題:")
for issue in issues:
print(f" ✗ {issue}")
if warnings:
print(f"\n⚠️ {len(warnings)}件の警告:")
for w in warnings:
print(f" △ {w}")
if not issues and not warnings:
print("\n🎉 環境は正常です!Browser-Useを始められます。")
if __name__ == "__main__":
check_environment()
実装方法がわかったので、次は具体的なユースケースを見ていきます。
6. ユースケース別ガイド
6.1 ユースケース1: 技術ブログの情報収集自動化
想定読者: 技術トレンドを追いかけるエンジニア・テックリード
推奨構成: Browser-Use + Claude Sonnet + スケジューラー
サンプルコード:
"""
技術ブログの最新記事を自動収集するAIエージェント
- 指定したサイトの最新記事タイトルとURLを取得
- 結果をMarkdownファイルに保存
実行方法: python collect_tech_articles.py
"""
import asyncio
import os
from datetime import datetime
from pathlib import Path
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig
from langchain_anthropic import ChatAnthropic
load_dotenv()
TECH_SITES = [
"https://news.ycombinator.com/",
"https://dev.to/",
"https://zenn.dev/",
]
async def collect_from_site(llm, site_url: str) -> str:
"""1つのサイトから最新記事を収集"""
browser = Browser(config=BrowserConfig(headless=True))
agent = Agent(
task=(
f"{site_url} にアクセスし、"
f"トップページに表示されている最新の技術記事から"
f"上位5件のタイトルとURLを抽出してください。"
f"結果は以下のMarkdown形式で返してください:\n"
f"- [タイトル](URL)"
),
llm=llm,
browser=browser,
max_steps=15,
)
result = await agent.run()
await browser.close()
return str(result)
async def main():
"""複数サイトから記事を収集してレポート生成"""
llm = ChatAnthropic(
model="claude-sonnet-4-5-20250929",
api_key=os.getenv("ANTHROPIC_API_KEY"),
temperature=0.0,
)
today = datetime.now().strftime("%Y-%m-%d")
report_lines = [f"# 技術記事収集レポート ({today})\n"]
for site in TECH_SITES:
print(f"収集中: {site}")
result = await collect_from_site(llm, site)
report_lines.append(f"\n## {site}\n")
report_lines.append(result)
report_lines.append("\n")
# レポート保存
report_path = Path(f"tech_report_{today}.md")
report_path.write_text("\n".join(report_lines), encoding="utf-8")
print(f"\n📄 レポート保存: {report_path}")
if __name__ == "__main__":
asyncio.run(main())
6.2 ユースケース2: フォーム自動入力
想定読者: 定型的なWeb入力作業を効率化したいバックオフィス担当
推奨構成: Browser-Use + Claude Sonnet + CSV入力
サンプルコード:
"""
CSVデータからWebフォームに自動入力するAIエージェント
実行方法: python auto_form_fill.py
"""
import asyncio
import csv
import os
from pathlib import Path
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig, Tools
from langchain_anthropic import ChatAnthropic
load_dotenv()
# カスタムツール: CSV読み込み
tools = Tools()
@tools.action(description="CSVファイルからデータを読み込む")
def read_csv_data(filepath: str) -> str:
"""CSVファイルを読み込んで文字列として返す"""
rows = []
with open(filepath, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
rows.append(str(dict(row)))
return "\n".join(rows)
async def fill_form(
llm, form_url: str, data: dict
) -> str:
"""1件のデータをフォームに入力"""
browser = Browser(
config=BrowserConfig(headless=False, slow_mo=300)
)
task = (
f"{form_url} にアクセスし、以下のデータを"
f"フォームに入力して送信してください:\n\n"
)
for key, value in data.items():
task += f"- {key}: {value}\n"
agent = Agent(
task=task,
llm=llm,
browser=browser,
tools=tools,
max_steps=25,
)
result = await agent.run()
await browser.close()
return str(result)
async def main():
"""CSVからデータを読み込んでフォーム入力"""
llm = ChatAnthropic(
model="claude-sonnet-4-5-20250929",
api_key=os.getenv("ANTHROPIC_API_KEY"),
temperature=0.0,
)
# サンプルデータ(実際はCSVから読み込む)
sample_data = [
{"名前": "田中太郎", "メール": "tanaka@example.com",
"部署": "開発部"},
{"名前": "佐藤花子", "メール": "sato@example.com",
"部署": "企画部"},
]
form_url = "https://example.com/registration"
for i, data in enumerate(sample_data):
print(f"入力中 ({i+1}/{len(sample_data)}): {data['名前']}")
result = await fill_form(llm, form_url, data)
print(f" 結果: {result}")
if __name__ == "__main__":
asyncio.run(main())
6.3 ユースケース3: ECサイトの価格監視
想定読者: 特定商品の価格変動を追跡したい個人・バイヤー
推奨構成: Browser-Use + Claude Haiku(コスト効率重視) + Cron
サンプルコード:
"""
ECサイトの価格を定期監視し、値下げを通知するエージェント
実行方法: python price_monitor.py
"""
import asyncio
import json
import os
from datetime import datetime
from pathlib import Path
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserConfig
from langchain_anthropic import ChatAnthropic
load_dotenv()
PRICE_LOG = Path("price_history.json")
# 監視対象商品
PRODUCTS = [
{
"name": "RTX 5090",
"url": "https://example-shop.com/products/rtx-5090",
"threshold": 300000, # 30万円以下で通知
},
]
def load_price_history() -> dict:
"""価格履歴をJSONから読み込む"""
if PRICE_LOG.exists():
return json.loads(PRICE_LOG.read_text(encoding="utf-8"))
return {}
def save_price_history(history: dict):
"""価格履歴をJSONに保存"""
PRICE_LOG.write_text(
json.dumps(history, ensure_ascii=False, indent=2),
encoding="utf-8"
)
async def check_price(llm, product: dict) -> dict:
"""商品ページにアクセスして価格を取得"""
browser = Browser(config=BrowserConfig(headless=True))
agent = Agent(
task=(
f"{product['url']} にアクセスし、"
f"「{product['name']}」の現在の販売価格を"
f"数値(円)で教えてください。"
f"税込価格がある場合は税込を優先してください。"
f"結果は数値のみ(例: 298000)で返してください。"
),
llm=llm,
browser=browser,
max_steps=10,
)
result = await agent.run()
await browser.close()
# 価格をパース
try:
price = int(
str(result).replace(",", "").replace("円", "").strip()
)
except ValueError:
price = -1
return {
"name": product["name"],
"price": price,
"threshold": product["threshold"],
"timestamp": datetime.now().isoformat(),
"alert": price > 0 and price <= product["threshold"],
}
async def main():
"""全商品の価格をチェック"""
llm = ChatAnthropic(
model="claude-haiku-4-5-20251001", # コスト効率重視
api_key=os.getenv("ANTHROPIC_API_KEY"),
temperature=0.0,
)
history = load_price_history()
for product in PRODUCTS:
print(f"価格チェック中: {product['name']}")
result = await check_price(llm, product)
# 履歴に追加
name = result["name"]
if name not in history:
history[name] = []
history[name].append({
"price": result["price"],
"timestamp": result["timestamp"],
})
# 結果表示
if result["alert"]:
print(f" 🔔 値下げ検知!{name}: {result['price']:,}円")
print(f" (閾値: {result['threshold']:,}円以下)")
elif result["price"] > 0:
print(f" 📊 {name}: {result['price']:,}円")
else:
print(f" ⚠️ {name}: 価格取得に失敗")
save_price_history(history)
print(f"\n📄 価格履歴保存: {PRICE_LOG}")
if __name__ == "__main__":
asyncio.run(main())
ユースケースを把握できたところで、この先の学習パスを確認しましょう。
7. 学習ロードマップ
この記事を読んだ後、次のステップとして以下をおすすめする。
初級者向け(まずはここから)
- Browser-Use公式リポジトリ のREADMEとサンプルコードを実行
- Browser-Use Web UI をインストールし、GUIで操作体験
- 自分の日常タスク(情報収集、フォーム入力等)で1つ自動化してみる
中級者向け(実践に進む)
- カスタムTools(Actions)を自作し、ドメイン固有の操作を追加
- 複数タブ操作を活用した並列リサーチの実装
- Browserbase を使ったクラウド実行環境の構築
- エラーハンドリングとリトライロジックの強化
上級者向け(さらに深く)
-
ChatBrowserUse()専用モデルのベンチマークと評価 - Playwrightのネットワークインターセプトと組み合わせたデータ収集パイプライン
- Browser-Use ソースコード の DOM蒸留ロジックを読む
- WebVoyagerベンチマークを自分の環境で再現
8. まとめ
この記事では、Browser-Useについて以下を解説した:
- Browser-Useとは何か: AIがブラウザを「見て」操作する、第3世代のWeb自動化フレームワーク
- 技術的な仕組み: DOM蒸留によるトークン効率化と、Playwrightベースの堅牢な実行基盤
- 実践的な使い方: 技術記事収集、フォーム自動入力、ECサイト価格監視の3パターン
私の所感
Browser-Useを初めて動かしたとき、「ブラウザ自動化の苦しみから解放された」と感じた。CSSセレクタが壊れて深夜にスクリプトを直す日々が、もう過去のものになるかもしれない。
ただし、現時点での課題も正直に書いておく。Cloudflareなどのボット検知が入ったサイトでは成功率が大幅に落ちる。ベンチマーク89.1%は「協力的なサイト」での結果であり、本番環境の成功率はこれより低くなることを前提にすべきだ。
それでも、「自然言語でブラウザを操作する」という体験は、一度味わうと戻れない。まずは簡単なタスクから試してみて、AIブラウザ自動化の可能性を体感してほしい。