在AI技术快速发展的今天,大模型与自动化工具的深入融合正在重塑传统工作流程。作为质量保证的重要技术手段,Web自动化测试在企业落地过程中却始终面临着脚本编写工作量大、用例维护成本高的问题。Browser-use应运而生,通过将Playwright浏览器控制框架与LLMs的自然语言理解能力相结合,开创性地实现了"自然语言驱动浏览器操作"的自动化范式,通过自然语言描述任务即可让DeepSeek等先进模型完成网页导航、元素操作、数据提取等全流程任务,为软件测试工程师提供了零门槛的智能自动化测试解决方案。
Browser-use 是一个开源的网页自动化库,其核心目标是通过标准化接口让LLMs(如GPT-4、Claude、DeepSeek等)与网页交互,从而执行复杂的浏览器任务。它结合了浏览器自动化工具(如Playwright)和LLMs的推理能力,允许用户通过自然语言描述的指令实现对浏览器的自动化操作。
Browser-use 的典型应用场景包括数据采集、自动化测试、在线订票、企业信息检索等,尤其适合需要高频操作网页的任务。
Browser-use采用的技术栈为:
1)Observation:页面解析层,采用DOM解析+截图辅助的非视觉+视觉方案。
DOM解析(HTML + XPath):Browser-use通过底层框架(如Playwright)获取当前页面的完整HTML结构,并提取文本、元素属性等关键信息。
截图辅助:在某些情况下(如验证码识别、动态图形验证),纯HTML解析可能无法直接获取信息,此时系统会自动或按需生成页面截图,并将截图作为辅助输入传递给视觉模型
2)Thought:核心决策层,分析Observation提供的页面信息并生成操作指令。
Browser-use基于LangChain构建,官方建议采用gpt-4o作为主模型,但目前也支持任何LangChain兼容的模型(如Claude 3.5、Llama 3.1等),包括DeepSeek等国产或第三方模型。(提示:Web Agent对大模型推理与结构化输出能力要求很高,低参数的开源模型,如果不经过针对性的微调,可能无法直接在这里使用)
3)Action:指令执行层,微软开发的Playwright作为浏览器控制框架直接与浏览器交互完成自动化任务。Playwright作为新一代高性能UI自动化测试框架,提供低延迟、高稳定性的浏览器控制能力,支持快速页面加载和元素操作。
1. 安装依赖
需Python 3.11+,安装browser-use、playwright及DeepSeek依赖:
pipinstallbrowser-useplaywrightplaywrightinstall#安装浏览器内核
2. 配置API密钥
在项目根目录创建.env文件,添加DeepSeek API密钥:
DEEPSEEK_API_KEY=sk-your-key-here
3.代码实现
fromlangchain_openaiimportChatOpenAIfrombrowser_useimportAgentimportasyncio,osfromdotenvimportload_dotenv#加载环境变量load_dotenv()asyncdefmain():#初始化DeepSeekV3模型llm=ChatOpenAI(base_url='https://api.deepseek.com/v1',model='deepseek-chat',api_key=os.environ.get('API_KEY')#替换为实际API密钥)#创建Agent并定义UI测试任务agent=Agent(task="""1.访问新浪官网首页(https://www.sina.com.cn/)2.点击导航栏的“时尚”菜单3.列出“最新”板块中前十条新闻的标题和发布时间,用json格式返回结果,示范格式如下:[{title:'时尚板块最新新闻标题1',publish_time:'3月3日13:20'}]""",llm=llm,use_vision=False#禁用视觉模式,依赖DOM解析)#执行任务后输出结果result=awaitagent.run()print("\n========测试结果========")print(result.final_result())asyncio.run(main())
运行日志中可以看到非常清晰的agent分步推理过程和执行步骤:
INFO[agent]?Startingtask:1.访问新浪官网首页(https://www.sina.com.cn/)2.点击导航栏的“时尚”菜单3.列出“最新”板块中前十条新闻的标题和发布时间,用json格式返回结果,示范格式如下:[{title:'时尚板块最新新闻标题1',publish_time:'3月3日13:20'}]INFO[agent]?Step1INFO[agent]?Eval:Unknown-StartingthetaskINFO[agent]?Memory:Startingthetask.0outof10stepscompleted.INFO[agent]?Nextgoal:NavigatetotheSinahomepageINFO[agent]?️Action1/1:{"go_to_url":{"url":"https://www.sina.com.cn/"}}INFO[controller]?Navigatedtohttps://www.sina.com.cn/INFO[agent]?Step2INFO[agent]?Eval:Success-NavigatedtotheSinahomepageINFO[agent]?Memory:1outof10stepscompleted.Nextstepistoclickonthe'Fashion'menuinthenavigationbar.INFO[agent]?Nextgoal:Clickonthe'Fashion'menuinthenavigationbarINFO[agent]?️Action1/1:{"click_element":{"index":52}}INFO[controller]?️Clickedbuttonwithindex52:时尚INFO[agent]?Step3ERROR[browser]Failedtoupdatestate:'None'INFO[agent]?Eval:Success-Clickedonthe'Fashion'menuINFO[agent]?Memory:2outof10stepscompleted.Nextstepistoextractthetitlesandpublishtimesofthetop10newsarticlesinthe'Latest'section.INFO[agent]?Nextgoal:Extractthetitlesandpublishtimesofthetop10newsarticlesinthe'Latest'sectionINFO[agent]?️Action1/1:{"extract_content":{"goal":"Extractthetitlesandpublishtimesofthetop10newsarticlesinthe'Latest'section"}}INFO[controller]?Extractedfrompage:```json{"titles_and_publish_times":[{"title":"太超前!预制换季穿搭,解锁早春的第一件外套","publish_time":"3月3日13:20"},{"title":"地母系和秋风感美人的穿搭秘籍,你get了吗?","publish_time":"3月3日13:17"},{"title":"“衬”来“衬”去,适合春天的衬衣叠穿!","publish_time":"3月3日13:14"},{"title":"韩女今年挚爱宽松呼吸感?穿出独特松弛氛围!","publish_time":"3月3日13:08"},{"title":"牛仔配牛仔?全身牛仔look只会让你更时髦!","publish_time":"2月24日14:41"},{"title":"徐娇出圈的国风穿搭,行走的马面裙种草机!","publish_time":"2月24日14:36"},{"title":"梨形身材救星?黑色长靴的扬长避短大法!","publish_time":"2月24日14:30"},{"title":"动物纹穿搭,优雅和性感都是信手拈来!","publish_time":"2月24日14:26"},{"title":"气温变化大穿什么?这个春天从“长裤”穿起!","publish_time":"2月17日14:59"},{"title":"《哪吒2》带火的中式穿衣!中国人有自己的老钱风","publish_time":"2月17日14:54"}]}```INFO[agent]?Step4INFO[agent]?Eval:Success-Extractedthetitlesandpublishtimesofthetop10newsarticlesinthe'Latest'sectionINFO[agent]?Memory:3outof10stepscompleted.Thetaskisnowcomplete.INFO[agent]?Nextgoal:CompletethetaskINFO[agent]?️Action1/1:{"done":{"text":"[{\"title\":\"太超前!预制换季穿搭,解锁早春的第一件外套\",\"publish_time\":\"3月3日13:20\"},{\"title\":\"地母系和秋风感美人的穿搭秘籍,你get了吗?\",\"publish_time\":\"3月3日13:17\"},{\"title\":\"“衬”来“衬”去,适合春天的衬衣叠穿!\",\"publish_time\":\"3月3日13:14\"},{\"title\":\"韩女今年挚爱宽松呼吸感?穿出独特松弛氛围!\",\"publish_time\":\"3月3日13:08\"},{\"title\":\"牛仔配牛仔?全身牛仔look只会让你更时髦!\",\"publish_time\":\"2月24日14:41\"},{\"title\":\"徐娇出圈的国风穿搭,行走的马面裙种草机!\",\"publish_time\":\"2月24日14:36\"},{\"title\":\"梨形身材救星?黑色长靴的扬长避短大法!\",\"publish_time\":\"2月24日14:30\"},{\"title\":\"动物纹穿搭,优雅和性感都是信手拈来!\",\"publish_time\":\"2月24日14:26\"},{\"title\":\"气温变化大穿什么?这个春天从“长裤”穿起!\",\"publish_time\":\"2月17日14:59\"},{\"title\":\"《哪吒2》带火的中式穿衣!中国人有自己的老钱风\",\"publish_time\":\"2月17日14:54\"}]","success":true}}INFO[agent]?Result:[{"title":"太超前!预制换季穿搭,解锁早春的第一件外套","publish_time":"3月3日13:20"},{"title":"地母系和秋风感美人的穿搭秘籍,你get了吗?","publish_time":"3月3日13:17"},{"title":"“衬”来“衬”去,适合春天的衬衣叠穿!","publish_time":"3月3日13:14"},{"title":"韩女今年挚爱宽松呼吸感?穿出独特松弛氛围!","publish_time":"3月3日13:08"},{"title":"牛仔配牛仔?全身牛仔look只会让你更时髦!","publish_time":"2月24日14:41"},{"title":"徐娇出圈的国风穿搭,行走的马面裙种草机!","publish_time":"2月24日14:36"},{"title":"梨形身材救星?黑色长靴的扬长避短大法!","publish_time":"2月24日14:30"},{"title":"动物纹穿搭,优雅和性感都是信手拈来!","publish_time":"2月24日14:26"},{"title":"气温变化大穿什么?这个春天从“长裤”穿起!","publish_time":"2月17日14:59"},{"title":"《哪吒2》带火的中式穿衣!中国人有自己的老钱风","publish_time":"2月17日14:54"}]INFO[agent]✅TaskcompletedINFO[agent]✅Successfully
1. 首先,Agent解读任务信息并拆解出第一步操作:
{"go_to_url":{"url":"https://www.sina.com.cn/"}}
接到指令的playwright会自动打开浏览器并导航至新浪首页(刚开始有短暂的白屏,需耐心等一小会儿)
2. Browser use解析HTML并识别出页面上的各种可定位的元素,给每个元素一个编号。然后Agent在元素中找到“时尚”菜单对应的编号为52,生成下一步点击指令:
{"click_element":{"index":52}}
3.playwright点击“时尚”菜单,页面跳转至新浪时尚专栏页面:
4.Browser use继续解析HTML并识别出页面上的各种可定位的元素, 在页面中查找“最新”板块中前十条新闻,并提取新闻标题和发布时间,然后生成下一步指令:
{"extract_content":{"goal":"Extractthetitlesandpublishtimesofthetop10newsarticlesinthe'Latest'section"}}
5.最终返回符合要求的json格式化输出(可以和网页界面上对比一下,结果是完全准确的!!!)
[{"title":"太超前!预制换季穿搭,解锁早春的第一件外套","publish_time":"3月3日13:20"},{"title":"地母系和秋风感美人的穿搭秘籍,你get了吗?","publish_time":"3月3日13:17"},{"title":"“衬”来“衬”去,适合春天的衬衣叠穿!","publish_time":"3月3日13:14"},{"title":"韩女今年挚爱宽松呼吸感?穿出独特松弛氛围!","publish_time":"3月3日13:08"},{"title":"牛仔配牛仔?全身牛仔look只会让你更时髦!","publish_time":"2月24日14:41"},{"title":"徐娇出圈的国风穿搭,行走的马面裙种草机!","publish_time":"2月24日14:36"},{"title":"梨形身材救星?黑色长靴的扬长避短大法!","publish_time":"2月24日14:30"},{"title":"动物纹穿搭,优雅和性感都是信手拈来!","publish_time":"2月24日14:26"},{"title":"气温变化大穿什么?这个春天从“长裤”穿起!","publish_time":"2月17日14:59"},{"title":"《哪吒2》带火的中式穿衣!中国人有自己的老钱风","publish_time":"2月17日14:54"}]
1.模型配置
通过ChatOpenAI类兼容DeepSeek API,指定base_url和模型名称(如deepseek-chat)。use_vision=False表示仅解析DOM结构,适合非视觉依赖的自动化操作。这里主推理模型的DeepSeek需要是 V3而非R1,因为R1没有function call的能力。
2.任务指令设计
任务描述需符合自然语言逻辑,分步骤明确操作目标(如点击、滚动、数据验证)。Agent会自动分解任务为“观察-决策-执行”循环。
执行过程:
a. Agent会依次完成以下操作:打开浏览器并导航至指定URL
b. 解析页面元素(通过DOM选择器或文本匹配)
c. 执行点击、滚动等交互动作
d. 提取数据并进行逻辑判断
3.结果输出与断言
final_result()返回结构化数据,符合提示词中的定义,适合进一步进行解析和断言。比如,可以使用python的assert做如下断言:
#json解析res=json.loads(result.final_result())assertlen(res)==10,f"实际获取新闻数量不足,预期10条,实际{len(result.final_result())}条"fornews_iteminres:#检查前十条assert'title'innews_item,"新闻条目缺少标题字段"assert'publish_time'innews_item,"新闻条目缺少发布时间字段"assertnews_item['title'].strip(),"新闻标题内容为空"assertnews_item['publish_time'].strip(),"发布时间内容为空"
1.自动失败重试
UI自动化测试总是不稳定怎么办?没关系,可以添加异常处理逻辑,如页面加载失败自动重试:
agent=Agent(task="...",llm=llm,max_failures=3,#失败时自动重试次数 retry_delay=10,#重试间隔时间)
2.自定义浏览器配置
playwright install命令自动下载了各种浏览器驱动。可以通过BrowserContextConfig可以自定义各种浏览器配置。
frombrowser_use.browser.contextimportBrowserContextConfigconfig=BrowserContextConfig(cookies_file="path/to/cookies.json",wait_for_network_idle_page_load_time=3.0,browser_window_size={'width':1280,'height':1100},locale='en-US',user_agent='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/85.0.4183.102Safari/537.36',highlight_elements=True,viewport_expansion=500,allowed_domains=['google.com','wikipedia.org'],)context=BrowserContext(browser=Browser(),config=config)asyncdefrun_search(): agent=Agent( browser_context=context, task='Yourtask', llm=llm...)
3. 使用deepseek-r1作为planner规划者
虽然R1不能直接作为agent的主推理模型,但可以作为planner(规划者),对于任务进行高层次的分析和拆解,指导主推理模型更好地完成任务。使用方法非常简单,只需定义一个planner模型然后传入参数
planner=ChatOpenAI(base_url='https://api.deepseek.com/v1',model='deepseek-reasoner',api_key=os.environ.get('API_KEY'))agent=Agent(task="...",planner_llm=planner,llm=llm,use_vision=False)
执行过程日志中可以看到,有R1推理过程,考虑了很多行动细节,比如首次打开页面可能会加载失败,所以需要验证页面加载成功;子菜单结构可能需要鼠标悬浮交互等等:
INFO[agent]PlanningAnalysis:```json{"state_analysis":"Browseriscurrentlyonanemptypage(about:blank),firststepofaccessinghttps://www.sina.com.cn/notyetinitiated","progress_evaluation":"0%-Initialnavigationstepnotcompleted","challenges":["BrowsernotyetnavigatedtotargetURL","
otentialpageloadingissuesafternavigation","https://www.sina.com.cn/",bilityuncertaintybeforepageinspection"],"next_steps":["Navigatetohttps://www.sina.com.cn/","VerifysuccessfulpageloadofSinahomepage"],"reasoning":"ThefundamentalprerequisiteforallsubsequentactionsisfirstloadingtheSinahomepage.Withoutcompletingthisinitialnavigationstep,noneoftherequiredelements(navigationbar,Fashionmenu)canbeaccessed.Pageloadverificationensuresstableenvironmentfornextsteps."}```(八)其他实践建议1.复杂任务需原子化拆解,采用多agent串行/并行执行,提高任务的可控性和成功率
2.可以进一步整合pytest等测试框架,并与CI/CD流水线集成
3.可考虑与AI测试用例生成工具联动,形成端到端的一站式AI测试平台
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |