
AI自动化测试框架browser use 项目测试总结
Browser Use 是一个基于 Python 开发的开源库,它将先进的 AI 技术与浏览器自动化功能深度融合。通过集成Playwright等浏览器自动化工具,Browser Use允许开发者使用任何支持LangChain的大型语言模型(如GPT-4、Claude等)来自动化浏览网页、提取信息、模拟用户操作等。效果最好的是gpt4o,但是价格太贵,且使用麻烦,需要网络代理.国产的大模型又没有那个
1. browser use简介
Browser Use 是一个基于 Python 开发的开源库,它将先进的 AI 技术与浏览器自动化功能深度融合。通过集成Playwright等浏览器自动化工具,Browser Use允许开发者使用任何支持LangChain的大型语言模型(如GPT-4、Claude等)来自动化浏览网页、提取信息、模拟用户操作等。
1.1. playwright
- Playwright 是一个由微软开发的现代化 端到端(E2E)测试工具,专门用于自动化 Web 浏览器操作。它支持 Chromium(Chrome、Edge)、Firefox 和 WebKit(Safari)三大浏览器引擎,且适用于跨平台(Windows、macOS、Linux)。
1.2. LangChain
- LangChain 是一个用于构建大语言模型(LLM)应用的开发框架,它通过模块化设计简化了 LLM 应用的开发流程,支持开发者快速搭建基于语言模型的复杂应用(如聊天机器人、知识库问答、自动化工作流等)。其核心思想是通过“链(Chain)”将不同组件(如模型、数据、工具)灵活组合,实现端到端的功能。
2. 测试demo用例1
2.1. 测试用例提示词
task:
case:
- 1. 打开网页 {test_url}/sp/ebdapp/home
- 2. 点击新建应用
- 3. 新建应用弹窗下 点击从空白创建
- 4. 新建应用弹窗下 填写应用名称:AI新建应用{now}
- 5. 新建应用弹窗下 点击确定按钮
- 6. 断言提示信息显示 应用新建成功 并判断是否能断言成功
- 7. 新建应用成功后 切换浏览器到最新的标签页
- 8. 最新的标签页 点击新建页面
- 9. 新建页面弹窗 点新建自定义页面
- 10. 创建页面弹窗 输入页面名称 AI测试新建EB页面{now}
- 11. 创建页面弹窗 点击确定按钮
- 12. 断言提示信息显示 保存成功 并判断是否能断言成功
- 13. 新建EB页面成功后 切换浏览器到最新的标签页
- 14. 点击页面中间位置 xpath定位为 //div[contains(@class,"weapp-ebde-grid-layout")]
- 15. 从左侧的组件栏中 查找列表 点击列表
- 15.1 点击请选择数据源 打开数据源设置弹窗
- 15.2 数据源设置弹窗下 点击业务模块-点击日志-点击操作日志-点击确定
- 15.3 点击点击设置字段 打开显示字段弹窗
- 15.4 显示字段弹窗下 点击全选label-点击确定
- 16. 等待0.5秒 点击左上的保存按钮
- 17. 等待1秒 点击预览按钮
- 18. 获取预览页面的全部信息
expect:
show: 序号
2.2. 执行过程
3. 专项事井然-测试用例demo
3.1. 测试用例提示词:
task:
case:
- 打开网页 {test_url}/ebdapp/view/1020021532740116481/PAGE
- 点击 新建项目
- 点击手动创建 xpath定位为 '//p[text()="手动创建"]' # 无法定位手动创建
- 选择项目类型弹窗 点击IT信息化项目类型
- 切换到新标签页
- 创建项目页面 输入项目名称 'AI自动化测试项目{now}'
- 创建项目页面 下拉选择项目状态 '进行中'
- 创建项目页面 点击保存按钮
- 打开网页 {test_url}/ebdapp/view/1020021532740116481/PAGE
- 点击 项目管理, 点击 我的项目
- 获取项目列表信息,断言新建项目是否成功
expect:
show: AI自动化测试项目{now}
3.2. 执行过程
4. 专项九氚汇-测试用例demo2-提交流程
4.1. 测试用例提示词:
task:
case:
- 打开网页 {test_url}/ebdapp/view/1024805950238597124/PAGE/1024805976159397672-1024805976159395990?
# - 打开网页 {test_url}/sp/workflow/flowpage/create/1063406582299271170? # 调试测试使用,直接访问流程填写页面
- 点击 流程
- 点击 全部流程
- 点击 提交申请
- 提交申请弹窗 点击 项目采购流程(2025-02-22 22:24:23)
- 切换新标签页
- 采购数量 输入 1000
- 采购单价 输入 100
- 预估金额 输入 80000
- 供应商名称 输入 AI测试
- 点击所属项目的输入框 点击测试11 # 执行很慢,而且成功率不高,测试了3次,成功1次
- 点击 提交
# - 提交确认弹窗 点击一级审批下的审批人员下的请选择输入框 选择普通成员一
# - 提交确认弹窗 向下滚动
# - 提交确认弹窗 二级审批下的审批人员 选择普通成员二
# - 提交确认弹窗 向下滚动
# - 提交确认弹窗 三级审批下的审批人员 选择普通成员三
- 提交确认弹窗 点击 确认并提交流程
- 切换回原标签页
- 点击全部流程
- 获取返回当前页的全部显示信息
expect:
show: 项目采购流程(2025-02-22 22:24:23)
4.2. 执行过程
5. 多家大语言的执行速度和执行效果测试
5.1. gpt-4o
- 优点: 效果最好的, 速度快, 操作的准确率也较高
- 缺点: 需要网络代理,且价格较贵,差不多是deepseekR1费用的7倍,仅测试几天的使用就用完了5美金的赠送费用
- 执行test_task用例: 45秒
5.2. deepseek官方接口
- 优点: 聪明
- 缺点1: deepseek官方接口目前很不稳定,经常无法调用.或者第一次调用成功,第二次就失败.
- 缺点2: 太慢了,作为推理模型,即使是很简单的问题,也会推理思考很久,就像是一个知识渊博,但回答慢的让人着急的老教授,不适合作用于我们这种测试场景
5.3. 公司本地部署的deepseek-R1-14B
- 优点: 成本低,无需网络代理, 本地部署不存在数据泄露风险
- 缺点: 速度慢,执行时间是gpt-4o的2-3倍,而且操作成功率也更低
5.4. 硅基流动的大模型接口
- model="deepseek-ai/DeepSeek-V3", # 慢,不够聪明
- model="deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", # 聪明,但是太慢了,作为推理模型,即使是很简单的问题,也会推理思考很久.就像是一个知识渊博,但回答慢的让人着急的老教授,不适合作用于我们这种测试场景
- model="Qwen/Qwen2.5-14B-Instruct", # 相对上面两个deepseek的更快, 执行test_task用例:40秒-62
- model="Qwen/Qwen2.5-32B-Instruct", # 比14B相对更聪明,执行时间也没有多多少, 执行test_task用例: 55秒
- model="Qwen/Qwen2.5-7B-Instruct", # 执行test_task用例:太笨了, 直接执行失败了
- model="01-ai/Yi-1.5-9B-Chat-16K", # 模型不支持
- model="THUDM/glm-4-9b-chat", # 智谱AI: 不够聪明,返回数据的格式都不符合要求
- model="Pro/THUDM/glm-4-9b-chat", # 智谱AI: 不够聪明,执行失败
- model="meta-llama/Meta-Llama-3.1-8B-Instruct", # 不够聪明,执行失败
- model="meta-llama/Meta-Llama-3.1-70B-Instruct", # 不够聪明,执行失败
- model="meta-llama/Llama-3.3-70B-Instruct", # 执行到最后直接卡死了,不操作也不报错停止
5.5. 阿里云百炼大模型接口
- model="qwen-max", # 执行效果还行
- model="qwen-plus", # 执行登录用例: 3分钟
- model="qwen-turbo", # 执行登录用例: 2分钟,有点笨,执行一直循环
5.6. 字节火山大模型-豆包
- model="ep-20250220153306-tswkf", # Doubao-1.5-lite-32k,执行结果数据不符合要求,无法使用
- model="ep-20250220154403-wfw29", # Doubao-1.5-pro-32k,执行结果数据不符合要求,无法使用
5.7. 大模型试用总结
- 效果最好的是gpt4o,但是价格太贵,且使用麻烦,需要网络代理.国产的大模型又没有那个能做到高效执行且精准操作的.
目前体验勉强能用的两个:
- 硅基流动的Qwen/Qwen2.5-32B-Instruct
- 阿里云百联的qwen-max和qwen-plus
6. 可能需要通过二开解决的问题
6.1. 需二开解决的问题
- 执行过程中每个步骤都会频繁的获取和保存cookie,这个需要二开修改限制获取cookie的次数
- 目前获取cookie的方法是通过登录用例获取,但无法处理验证码,后续需要追加接口登录获取cookie
- 目前默认执行保存全部操作的GIF动图,用例多了之后文件大小或很大,需要二开修改会仅保存断言截图,或仅保存失败用例的GIF动图(已修改)
- 部分目前不支持的操作(1.用例执行过程中断言截图,2.键盘事件如回车搜索),需要在controller中自定义新增符合我们需求的action,但源码较复杂,二开的难度较大(已新增鼠标悬停方法)
- 部分元素无法定位的问题, 可能也需要通过二开修改DOM数据解析方法实现,但这个的二开难度更大,需要熟悉前端的同事协助评估
- 执行报告GIF中的步骤说明,中文乱码,需要处理(修改了源码中使用的字体解决了GIF中文乱码)
6.2. 鼠标悬停方法(二开新增)
6.2.1. controller下的servise.py
# Element Interaction Actions
@self.registry.action('Mouse Hover', param_model=MouseHoverAction)
async def mouse_hover(params: MouseHoverAction, browser: BrowserContext):
"""二开新增 - 鼠标悬停动作"""
session = await browser.get_session()
state = session.cached_state
if params.index not in state.selector_map:
raise Exception(
f'Element with index {params.index} does not exist - retry or use alternative actions')
element_node = state.selector_map[params.index]
msg = None
try:
# 执行鼠标悬停操作
await browser._mouse_hover_node(element_node)
msg = f'🖱️ MouseHover element with index {params.index}: {element_node.get_all_text_till_next_clickable_element(max_depth=2)}'
logger.info(msg)
logger.debug(f'Element xpath: {element_node.xpath}')
return ActionResult(extracted_content=msg, include_in_memory=True)
except Exception as e:
logger.warning(
f'Element not MouseHover with index {params.index} - most likely the page changed')
return ActionResult(error=str(e))
6.2.2. controller下的views.py
class MouseHoverAction(BaseModel):
# 鼠标悬停动作的数据参数类型, 通过定义数据模型,确保AI按照提示词生成的输入数据的类型,和结构是否正确。
index: int
xpath: Optional[str] = None
6.2.3. browser下的context.py
async def _mouse_hover_node(self, element_node: DOMElementNode) -> Optional[str]:
"""
二次开发 - 增加鼠标悬停操作方法
"""
page = await self.get_current_page()
try:
# Highlight before clicking
if element_node.highlight_index is not None:
await self._update_state(focus_element=element_node.highlight_index)
element_handle = await self.get_locate_element(element_node)
if element_handle is None:
raise Exception(f'Element: {repr(element_node)} not found')
async def mouse_hover(hover_func):
"""实际执行的鼠标悬停方法"""
await hover_func()
await page.wait_for_load_state()
await self._check_and_handle_navigation(page)
try:
# 使用playwright的hover方法
return await mouse_hover(lambda: element_handle.hover(timeout=1500))
except URLNotAllowedError as e:
raise e
except Exception:
try:
# 继续尝试JS执行鼠标悬停
return await mouse_hover(lambda: page.evaluate(
'(el) => { const event = new MouseEvent("mouseover", { bubbles: true }); el.dispatchEvent(event); }',
element_handle
))
except URLNotAllowedError as e:
raise e
except Exception as e:
raise Exception(f'Failed to mouse hover element: {str(e)}')
except URLNotAllowedError as e:
raise e
except Exception as e:
raise Exception(f'Failed to mouse hover element: {repr(element_node)}. Error: {str(e)}')
7. 提示词总结
7.1. 系统提示词
- class SystemPrompt: 提示词类中定义了核心的系统提示词,给AI设定了身份,告知了AI需要做什么,以什么格式返回数据,包含那些可
7.1.1. 重要规则
系统提示词 |
用途 |
补充 |
RESPONSE FORMAT |
规范返回数据的格式 |
|
ACTIONS |
告诉AI如何执行动作 |
|
ELEMENT INTERACTION |
规范元素操作的方式 |
|
NAVIGATION & ERROR HANDLING |
执行中遇到错误时的处理逻辑 |
|
TASK COMPLETION |
规定任务完成的条件:
|
可以尝试通过完成条件的第4点进行用例断言 |
VISUAL CONTEXT |
增加视觉相关的辅助功能 |
目前仅gpt-4o能比较好的支持视觉,国产常用的几个大模型都不支持 |
Form filling |
表格填写时可能遇到的注意事项 |
|
ACTION SEQUENCING |
动作序列: 1.规范动作执行的方式 2.提高动作执行的效率 |
|
Long tasks |
针对长任务的补充说明 |
|
Extraction |
说明提取信息的方法和调用方法 |
7.1.2. 输入格式input_format
- 规范AI转换用户输入的文本为可操作的语句给到框架的格式.需要包含URL,可用标签页,可操作元素.
7.1.3. 获取系统信息get_system_message
- 规范获取信息的方式和方法
7.1.4. 用户自定义补充系统提示词
- 继承系统提示词类,添加额外的系统提示词,但目前测试的效果比较一般,部分提示词不生效,比如捕获页面错误
class MySystemPrompt(SystemPrompt):
"""前置添加额外的提示词"""
def important_rules(self):
existing_rules = super().important_rules()
new_rules1 = '大多数情况下,按钮点击都是点确定按钮,不要点取消按钮'
new_rules2 = '任何执行阶段,只要出现错误提示弹窗(弹窗内容可能为:系统错误,error,500等),则判断用例执行失败,并停止运行'
new_rules3 = '当遇见不明弹窗遮挡时,点击右上的x关闭弹窗'
return f'{existing_rules}\n{new_rules1}\n{new_rules2}\n{new_rules3}'
7.2. 动作提示词
- 以下为框架内目前支持的动作,其它的动作可能需要二开补充,或通过优化提示词实现操作
- 目前不支持或操作困难的组件: 人员选择框, 浏览选择框, 日期时间选择框, 符号操作按钮
中文提示词 |
对应controller中action |
说明 |
谷歌搜索 |
search_google |
可以参考这个方法,尝试新增动作 |
点击 |
click_element |
|
输入 |
input_text |
|
快捷键 |
send_keys |
举例: Backspace, Insert, PageDown, Delete, Control+Shift+T |
打开网页 |
go_to_url |
|
切换选项卡/标签页 |
switch_tab |
|
打开 一个新的选项卡/标签页 |
open_tab |
|
提取/获取页面内容 |
extract_content |
|
向下/向上滚动 |
scroll_down, scroll_up |
|
滚动到文本 |
scroll_to_text |
|
获取下拉选项 |
get_dropdown_options |
|
选择下拉选项 |
select_dropdown_option |
看源码应该仅支持<select>标签 |
鼠标悬停 |
mouse_hover |
二开新增的操作方法 |
7.3. 其它自己总结的提示词
中文提示词 |
作用 |
补充 |
点击页面中间位置 xpath定位为 //div[contains(@class,"weapp-ebde-grid-layout")] |
定位部分不好描述的元素 |
目前demo1是可用的,但还未大批量验证,这样写是否可行 |
点击所属项目的输入框 点击测试11 |
操作选择浏览框数据 |
执行很慢,而且成功率不高,测试了3次,成功1次 |
编辑操作组弹窗 点击已设置操作者下 所有人列的启用按钮 |
但存在重复的中文时,尽量详细的描述去,帮助AI找到你想操作的元素 |
8. browser use中使用的第三方库总结
8.1. Pydantic
- 用在views.py中,用于数据验证和设置管理。通过定义数据模型,确保AI按照提示词生成的输入数据的类型,和结构是否正确。
- 数据验证:自动验证输入数据是否符合类型和规则。
- 数据转换:将原始数据转换为符合模型的 Python 对象。
- 序列化与反序列化:支持将模型转换为字典或 JSON。
- IDE 友好:利用类型提示提供自动补全和错误提示。
更多推荐
所有评论(0)