Browser-use探索

Browser-user:自动操作浏览器的agent

官网:https://browser-use.com/

demo:

from langchain_openai import ChatOpenAI
from browser_use import Agent
from dotenv import load_dotenv
import os
import asyncio

load_dotenv()

api_key = os.getenv('Silicon_Cloud_API_KEY')
base_url = os.getenv('Base_URL')
model = os.getenv('Model')

llm = ChatOpenAI(model=model, api_key=api_key, base_url=base_url)

async def main():
    agent = Agent(
        task="访问 https://www.baidu.com 并执行以下操作:\n"
             "1. 等待页面完全加载\n"
             "2. 在登录表单中输入用户名:xxxx\n"
             "3. 输入密码:xxxx\n"
             "4. 如果存在滑块验证,完成滑块验证\n"
             "5. 点击登录按钮\n"
             "6. 等待登录完成",
        llm=llm,
        use_vision=True,  # 启用视觉功能以更好地处理滑块验证
    )
    result = await agent.run()
    print(result)

if __name__ == "__main__":
    asyncio.run(main())

 

结合pytest试试

conftest.py

import pytest
import os
from dotenv import load_dotenv
from utils.agent_helper import TestAgent

# 加载环境变量
load_dotenv()

@pytest.fixture(scope="session")
def api_config():
    """
    提供API配置信息
    """
    return {
        "api_key": os.getenv("Silicon_Cloud_API_KEY"),
        "base_url": os.getenv("Base_URL"),
        "model": os.getenv("Model")
    }

@pytest.fixture(scope="class")
def test_agent(api_config):
    """
    提供TestAgent实例
    """
    print("Creating test agent with config:", api_config)  # 添加调试信息
    agent = TestAgent(
        api_key=api_config["api_key"],
        base_url=api_config["base_url"],
        model=api_config["model"]
    )
    yield agent  # 使用yield而不是return,以支持清理操作

@pytest.fixture(scope="session")
def test_url():
    """
    提供测试URL
    """
    return "https://www.baidu.com"

@pytest.fixture(scope="session")
def test_credentials():
    """
    提供测试账号信息
    """
    return {
        "username": "xxxxx",
        "password": "xxxx"
    } 

test_login.py

import pytest
from utils.assertions import assert_login_success, assert_element_exists

pytestmark = pytest.mark.asyncio

@pytest.mark.usefixtures("test_agent")
class TestLogin:
    async def test_login_success(self, test_agent, test_url, test_credentials):
        """
        测试登录功能
        """
        print("Starting login test with agent:", test_agent)  # 添加调试信息
        
        # 执行登录操作
        result = await test_agent.login(
            url=test_url,
            username=test_credentials["username"],
            password=test_credentials["password"]
        )
        
        # 验证登录结果
        assert_login_success(result)
        #
        # # 验证登录后的页面元素
        dashboard_exists = await test_agent.verify_element_exists("仪表盘或管理面板")
        assert_element_exists(dashboard_exists, "仪表盘或管理面板")

    @pytest.mark.parametrize("invalid_credentials", [
        {"username": "wrong_user", "password": "admin"},
        {"username": "admin", "password": "wrong_pass"},
    ])
    async def test_login_failure(self, test_agent, test_url, invalid_credentials):
        """
        测试登录失败场景
        """
        result = await test_agent.login(
            url=test_url,
            username=invalid_credentials["username"],
            password=invalid_credentials["password"]
        )

        # 验证是否包含错误信息
        assert any(error in result for error in ["登录失败", "用户名或密码错误", "验证失败"])

agent_helper.py

from browser_use import Agent
from typing import Dict, Any, Optional
from langchain_openai import ChatOpenAI

class TestAgent:
    def __init__(self, api_key: str, base_url: str, model: str):
        """
        初始化TestAgent
        :param api_key: API密钥
        :param base_url: API基础URL
        :param model: 使用的模型名称
        """
        self.llm = ChatOpenAI(
            model=model,
            api_key=api_key,
            base_url=base_url
        )
        
    def _create_agent(self, task: str) -> Agent:
        """
        创建一个新的Agent实例
        :param task: 任务描述
        :return: Agent实例
        """
        return Agent(
            task=task,
            llm=self.llm,
            use_vision=True
        )
        
    async def execute_task(self, task: str) -> str:
        """
        执行指定的任务
        :param task: 任务描述
        :return: 任务执行结果
        """
        agent = self._create_agent(task)
        return await agent.run()
    
    async def login(self, url: str, username: str, password: str) -> str:
        """
        执行登录操作
        :param url: 登录页面URL
        :param username: 用户名
        :param password: 密码
        :return: 登录结果
        """
        task = (
            f"访问 {url} 并执行以下操作:\n"
            f"1. 等待页面完全加载\n"
            f"2. 在登录表单中输入用户名:{username}\n"
            f"3. 输入密码:{password}\n"
            f"4. 点击登录按钮\n"
            f"5. 等待登录完成"
        )
        return await self.execute_task(task)
    
    async def verify_element_exists(self, description: str) -> bool:
        """
        验证页面元素是否存在
        :param description: 元素描述
        :return: 元素是否存在
        """
        task = f"验证页面上是否存在:{description}"
        result = await self.execute_task(task)
        return "找到" in result or "存在" in result

assertions.py

from typing import Any

def assert_task_success(result: str, expected_content: str):
    """
    验证任务执行结果是否符合预期
    :param result: 实际结果
    :param expected_content: 预期内容
    """
    assert expected_content in result, f"预期结果应包含 '{expected_content}',但实际结果为:{result}"

def assert_element_exists(exists: bool, element_description: str):
    """
    验证元素是否存在
    :param exists: 元素是否存在
    :param element_description: 元素描述
    """
    assert exists, f"预期元素 '{element_description}' 应该存在,但未找到"

def assert_login_success(result: str):
    """
    验证登录是否成功
    :param result: 登录操作的结果
    """
    success_indicators = ["登录成功", "成功登录", "已登录", "登录完成"]
    assert any(indicator in result for indicator in success_indicators), \
        f"登录应该成功,但结果为:{result}"

 

再放个配置文件.env:

Silicon_Cloud_API_KEY=
Base_URL=https://api.siliconflow.cn
Model=Qwen/Qwen2.5-72B-Instruct

 

posted @ 2025-03-20 17:49  RichardShi  阅读(180)  评论(0)    收藏  举报