0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Browser Use を試してみた

Last updated at Posted at 2025-07-05

はじめに

「AI エージェント」を使おう、とよく聞きます。その中で、「Browser Use」がすごいという記事を見かけました。

AIが勝手にブラウザを操作していろいろやってくれちゃう BrowserUseが爆誕|shi3z

これを友人(@digital24s さん)と一緒に試してみました。

Browser Use を試してみた

Browser Use 0.1.45 および 0.4.4

Browser Use とは

Browse Use は、ローカル環境のブラウザを LLM が操作できるようにする Python ライブラリです。2024 年 11 月に公開されています。

GitHub - browser-use/browser-use: 🌐 Make websites accessible for AI agents. Automate tasks online with ease.

実行環境を用意する

ウェブブラウザを操作する機能なので、Google Colab のような環境は無理でしょう。Windows 、macOS 、Linux のデスクトップ環境で試してみました。
LLM は Gemini API のようなクラウドサービスを使うので、CPU のみの環境で OK です。
ただし Python は 3.11 以降が要求されています。

Browser Use を使う

Browser Use をインストールして実行してみます。

browser-useの基礎理解

まず、必要なライブラリをインストールします。

$ pip install browser-use

Browser Use は、Microsoft PlaywightLangChain を使用しているようです。上記のコマンドで、関連するライブラリもインストールされます。↑

続いて、インストールされた Playwight 環境を初期化します。

$ playwright install 

LLM は Gemini API を使いたいと思います。API キーを取得して環境変数にセットしておきます。

.env
GOOGLE_API_KEY=(予め取得した API キー)

BrowserUse を使ってウェブブラウザを操作するコードです。↓

import langchain_google_genai
import browser_use
import asyncio

async def main():

    # モデルを準備
    llm = langchain_google_genai.ChatGoogleGenerativeAI(
        model="gemini-2.0-flash",
    )

    # ブラウザを呼出する準備
    browser = browser_use.Browser(
        config=browser_use.BrowserConfig(
            headless=False,
        )
    )

    # クエリを準備
    query = """テレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""

    # エージェントを準備
    agent = browser_use.Agent(
        llm=llm,
        task=query,
        browser=browser,
    )

    # エージェントを実行
    history = await agent.run()
    # 結果を表示
    result = history.final_result()
    if result:
        print(result)
    else:
        print("検索結果なし")

asyncio.run(main())

LangChain を使った mcp-use ライブラリを利用したときのコードに似ていますね。↑

playwright install が実行できなかった

上記の手順で特に難しいところはなさそうですが、幾つかハマりました。

playwright install しないといけないのですが、実行エラーになりました。↓

'playwright' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

playwright ライブラリは pip でインストールできているはずです。Python プログラムから呼出するのはこれで OK でした。
playwright ライブラリがブラウザを呼出する準備するために、ライブラリと一緒に実行ファイル playwright がインストールされていて、これを実行するようです。
Windows の場合、以下の場所に実行ファイルが置かれていました。

%USERPROFILE%\AppData\Roaming\Python\Python(バージョン番号)\Scripts\

上記にパスを通しておくか、以下のコマンドで実行します。

$ python -m playwright install

agent.run() でエラーになった

1 箇月ほど経ってから別の実行環境で、上記の手順とコードを実行したところ、以下のエラー発生しました。

    agent = browser_use.Agent(
        llm=llm,
"ChatGoogleGenerativeAI" object has no field "ainvoke"

エラー発生しない実行環境の borowser-use を確認すると、バージョン 0.1.45 でした。エラー発生する実行環境は、バージョン 0.4.4 になっていました。

公式サイトのサンプルコードを見ると、以下が変更されていました。

import browser_use.llm

    (中略)

    llm = browser_use.llm.ChatGoogle(
        model="gemini-2.0-flash"
    )
    (後略)

従来は langchain の LLM ライブラリを使用していましたが、browser-use ライブラリで置換しているようです。

headless モードで実行してみる

上記のコードは実行すると、Chrome ブラウザが起動して、それが操作されている様子が見られます。これは分かりやすくていいのですが、起動しているブラウザをユーザが触ってしまうと、よろしくありません。そこで headless モードで実行してみます。

    (前略)
    browser = browser_use.Browser(
        config=browser_use.BrowserConfig(
            headless=True,                 # ヘッドレスモードにしてみる
        )
    )
    (後略)

出力形式を指定する

上記のコードは検索結果を文章で返してくれますが、プログラムで利用し易い形式で取得したいこともあります。そのための機能を browser-use は用意してくれています。

Output Format - Browser Use

(前略)
from pydantic import BaseModel
from typing import List

    (中略)

    class Result(BaseModel):
        title: str
        station: str
        datetime: str

    class Results(BaseModel):
        results: List[Result]

    controller = browser_use.Controller(
        output_model=Results
    )

    query = """テレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""

    agent = browser_use.Agent(
        llm=llm,
        task=query,
        browser=browser,
        controller=controller
    )

    history = await agent.run()
    result = history.final_result()
    if result:
        parsed = Results.model_validate_json(result)
        print(parsed.results)
    (後略)

検索結果が空になった

上記のコードは既存のコードに controller を指定しただけです。検索結果は同じになるはずですが、実行すると検索結果が空になりました。
Function Call したときも同様ですが、プログラムの挙動は Python のコードやライブラリの実装でなく、LLM が制御しています。class Result で指定したデータ構造を見て、ウェブサイトの検索結果から該当する情報を取得しようとして、できなかったようです。
項目名を変えてみます。↓

    class Result(BaseModel):
        program_title: str
        broadcast_station: str
        broadcast_datetime: str

結果が取得できるようになりました。

英語圏のテレビ番組表が検索された

実行してみると、以前より検索に時間が掛かりました。ブラウザの挙動を見ていると、英語圏のテレビ番組表を検索していました。これも、class Result の指定が英語だからでしょうか。
クエリ文に「日本の」を加えておきます。↓

    query = """日本のテレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""

日本のテレビ番組表を検索してくれました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?