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 asyncioload_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_existspytestmark = 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 ChatOpenAIclass 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 Anydef 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