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

浙公网安备 33010602011771号